原来组合数取模是可以这样暴力的
来源:互联网 发布:淘宝标题组合工具箱 编辑:程序博客网 时间:2024/05/08 22:28
原来组合数取模是可以这样暴力的
分类: 数论2013-03-23 16:36 80人阅读 评论(0) 收藏 举报
题目:NEFU628 Garden visiting
对于组合数C(n,m),我们求C(n,m)%p,当然给定范围是0<=n,m<=10^6,p<=10^5注意这里p不一定是素数,如果p是素数,很明显,Lucas一下搞定毫
无压力,但是p可能为合数。。。。。。。
对于这个我参照了AC大牛的思路,我们先求出阶乘中各个素因子的幂的次数,这里很巧妙,对于分母的话,就是负次幂,然后直接把每个素因子的幂
次统计在一个数组里面保存,最后就直接二分求问题的解,具体思路参照代码:
- #include <stdio.h>
- #include <string.h>
- typedef long long LL;
- const int N = 2000001;
- const int M = 150000;
- LL MOD;
- bool prime[N];
- LL p[M];
- LL k=0;
- void isprime()
- {
- LL i,j;
- memset(prime,true,sizeof(prime));
- for(i=2;i<N;i++)
- {
- if(prime[i])
- {
- p[k++]=i;
- for(j=i+i;j<N;j+=i)
- {
- prime[j]=false;
- }
- }
- }
- }
- LL multi(LL a, LL b, LL m)
- {
- LL ans=0;
- a%=m;
- while(b)
- {
- if(b&1)
- {
- ans=(ans+a)%m;
- b--;
- }
- b>>=1;
- a=(a+a)%m;
- }
- return ans;
- }
- LL quick_mod(LL a,LL b,LL m)
- {
- LL ans=1;
- a%=m;
- while(b)
- {
- if(b&1)
- {
- ans=ans*a%m;
- b--;
- }
- b>>=1;
- a=a*a%m;
- }
- return ans;
- }
- LL fac(LL n,LL A[],LL d)
- {
- LL i;
- for(i=0;i<k&&p[i]<=n;i++)
- {
- LL x=n;
- while(x)
- {
- A[i]+=d*(x/p[i]);
- x/=p[i];
- }
- }
- return i;
- }
- LL C(LL n,LL m)
- {
- LL temp;
- LL A[M];
- memset(A,0,sizeof(A));
- temp=fac(n,A,1);
- fac(m,A,-1);
- fac(n-m,A,-1);
- LL ret=1;
- for(LL i=0;i<temp;i++)
- ret=multi(ret,quick_mod(p[i],A[i],MOD),MOD);
- return ret%MOD;
- }
- int main()
- {
- isprime();
- LL t,n,m;
- scanf("%I64d",&t);
- while(t--)
- {
- scanf("%I64d%I64d%I64d",&n,&m,&MOD);
- LL ans = C(m+n-2,n-1)%MOD;
- printf("%I64d\n",ans);
- }
- return 0;
- }
- 原来组合数取模是可以这样暴力的
- 原来WINDOWS可以这样的
- 原来Javascript还是可以这样写的
- 原来Javascript还是可以这样写的
- 子查询,原来可以这样子的
- 原来继承可以这样用的
- 原来程序员的母亲节可以这样温馨!
- 原来生活可以这样!!
- 原来可以这样。。
- 原来我可以这样
- 原来可以这样赋值
- 原来还可以这样,原来还可以这样。原来还可以这样,原来还可以这样,原来还可以这样
- 原来程序可以这样写
- 原来javascript可以这样加密
- 原来update可以这样写!
- 原来电影可以这样拍
- 秋,原来可以这样拍
- Public 原来可以这样写
- 可重入函数分析
- hdu 1075 What Are You Talking About
- 存储过程和事务
- Hdu 1242 Rescue
- 原根
- 原来组合数取模是可以这样暴力的
- HDU4667 Building Fence(凸包)
- (离散对数与原根)
- POJ2187(旋转卡壳求平面最远点对)
- python-swiftclient client.py源码分析
- NJUST1722(大数分解的应用)
- NFC写Uri进Tag,与识别Tag
- UVA 10791 Minimum Sum LCM
- HDU 4601 Letter Tree (线段树+字典树+树型转线性)