博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu2183【国家集训队】礼物
阅读量:5238 次
发布时间:2019-06-14

本文共 2259 字,大约阅读时间需要 7 分钟。

题解

易得答案为

$$ \sum_{i=1}^m\binom{n-\sum_{j=1}^{i-1}w_j}{\sum_{j=1}^iw_j} $$

扩展$\text{Lucas}$即可

代码

#include
#include
#include
#include
#define RG register#define file(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);#define clear(x, y) memset(x, y, sizeof(x))#define int long longinline int read(){ int data = 0, w = 1; char ch = getchar(); while(ch != '-' && (!isdigit(ch))) ch = getchar(); if(ch == '-') w = -1, ch = getchar(); while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar(); return data * w;}inline int fastpow(int x, int y, int Mod){ int ans = 1; while(y) { if(y & 1) ans = 1ll * ans * x % Mod; x = 1ll * x * x % Mod, y >>= 1; } return ans;}void exgcd(int a, int b, int &d, int &x, int &y){ !b ? d = a, x = 1, y = 0 : (exgcd(b, a % b, d, y, x), y -= x * (a / b));}inline int Inv(int i, int Mod){ if(!i) return 0; int x, y, d, a = i, b = Mod; exgcd(a, b, d, x, y); x = (x % b + b) % b; if(!x) x += b; return x;}int mul(int n, int p, int k){ if(!n) return 1; int ans = 1; for(int i = 2; i <= k; i++) if(i % p) ans = ans * i % k; ans = fastpow(ans, n / k, k); for(int i = 2; i <= n % k; i++) if(i % p) ans = ans * i % k; return ans * mul(n / p, p, k) % k;}inline int C(int n, int m, int Mod, int p, int k){ if(m > n) return 0; int a = mul(n, p, k), b = mul(m, p, k), c = mul(n - m, p, k), _k = 0; for(int i = n; i; i /= p) _k += i / p; for(int i = m; i; i /= p) _k -= i / p; for(int i = n - m; i; i /= p) _k -= i / p; int ans = a * Inv(b, k) % k * Inv(c, k) % k * fastpow(p, _k, k) % k; return ans * (Mod / k) % Mod * Inv(Mod / k, k) % Mod;}int n, m, sum, Mod, ans = 1, a[20];signed main(){#ifndef ONLINE_JUDGE file(cpp);#endif Mod = read(), n = read(), m = read(); for(signed i = 1; i <= m; i++) sum += (a[i] = read()); if(sum > n) return puts("Impossible") & 0; for(signed k = 1; k <= m; k++) { n -= a[k - 1]; int now = 0, x = Mod; for(int i = 2; i * i <= Mod; i++) if(!(x % i)) { int _k = 1; while(!(x % i)) _k *= i, x /= i; now = (now + C(n, a[k], Mod, i, _k)) % Mod; } if(x > 1) now = (now + C(n, a[k], Mod, x, x)) % Mod; ans = ans * now % Mod; } printf("%lld\n", ans); return 0;}

转载于:https://www.cnblogs.com/cj-xxz/p/10199631.html

你可能感兴趣的文章
nodejs-Path模块
查看>>
python学习(二十二) String(上)
查看>>
oracle函数 NLS_LOWER(x[,y])
查看>>
free内存监控
查看>>
Bean in Configuration Or Component
查看>>
JavaScript基础知识梳理----正则表达式
查看>>
USACO Training完结感想
查看>>
python-19 随机模块 random
查看>>
Xcode8更新约束
查看>>
《JAVA与模式》之状态模式
查看>>
2012 East Central Regional Contest Gym100642E
查看>>
C#的百度地图开发(四)前端显示与定位
查看>>
jQuery_Tab切换
查看>>
软件合作开发:2012年年底给苏州工业园区某家软件企业实施C#.NET软件开发系统框架的经验小结...
查看>>
jquery操作select(增加,删除,清空)
查看>>
Oracle 10gR2 RAC
查看>>
centos中跳过权限修改密码
查看>>
C语言中的预处理指令和递归
查看>>
ValueError: 'format' in __slots__ conflicts with class variable
查看>>
javasciprt cookies 操作
查看>>