LightOJ - 1067 数论<100000左右的组合数取模求法《逆元》>
来源:互联网 发布:mindjet 14 mac 破解 编辑:程序博客网 时间:2024/04/27 08:31
题目链接: LightOJ - 1067
对于组合数取模的问题----数值10e6且询问的次数很多的情况--我们可以通过打表降低时间复杂度
先说一下:C(n,m)= n!/(m!*(n-m)!)-----
C(n ,m)=(n*(n-1)*....*(n-m+1))/(1*2*..........*m)=(n*(n-1)*(n-2)*....1)/((n-m)*(n-m-1)*...*1)/(1*2*...*m)= N! / M! /(N-M)!
打一个N!取模表--再打一个N!对模的逆元表--
对于(A/B)mod C 的问题,直接(A mod C)/ (B mod C)是错误的: ( 16/ 8 ) % 4 == 2 而 (16%4)/(8%4)无意义--
逆元 AB==1(mod)C
A关于C的逆元为B-
B关于C的逆元为A-
即关于对C取模时---A*B=1;
B=1/A;
当我们求S/A(mod)C时---我们就可以求S*B(mod)C了---
求逆元可以用拓展欧几里德--
在此题还可以用费马小定理
假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p)。即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。
a(p-1)≡1(mod p)所以--- a * a(p-2)≡1(mod p)----即 a 关于 P 的逆元为 *a(p-2) 然后快速幂就行了...
用费马小定理+快速幂在此题时间上有优势:
拓展欧几里德求逆元:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define LL long long#define MA 1000100#define mod 1000003LL pri[MA];LL ni[MA],ans;LL extend(LL a,LL b,LL &x,LL &y){if (b==0){x=1;y=0;return a;}else{LL t=extend(b,a%b,y,x);y-=x*(a/b);return t;}}void s(){pri[0]=1;LL x,y;ni[0]=1;for (int i=1;i<MA;i++){pri[i]=pri[i-1]*i%mod;extend(pri[i],mod,x,y);ni[i]=(x%mod+mod)%mod;}}int main(){s();int t,n,k,ca=1;scanf("%d",&t);while (t--){scanf("%d%d",&n,&k);ans=((pri[n]*ni[k]%mod)*ni[n-k])%mod;printf("Case %d: %lld\n",ca++,ans);}return 0;}
费马小定理+快速幂求逆元:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define LL long long#define MA 1000100#define mod 1000003LL pri[MA];LL ni[MA],ans;LL pp(LL xx,int k){LL lp=1,huan=xx;while (k){if (k%2)lp=(lp*huan)%mod;huan=(huan*huan)%mod;k/=2;}return lp;}void s(){pri[0]=1;LL x,y;ni[0]=1;for (int i=1;i<MA;i++){pri[i]=pri[i-1]*i%mod;ni[i]=pp(pri[i],mod-2);}}int main(){s();int t,n,k,ca=1;scanf("%d",&t);while (t--){scanf("%d%d",&n,&k);ans=((pri[n]*ni[k]%mod)*ni[n-k])%mod;printf("Case %d: %lld\n",ca++,ans);}return 0;}
0 0
- LightOJ - 1067 数论<100000左右的组合数取模求法《逆元》>
- 各种逆元求法 组合数取模 comb (组合数 Lucas)
- lightoj 1067 - Combinations (组合数、乘法逆元)
- 乘法逆元的求法
- 乘法逆元的求法
- HDU 5698 瞬间移动 [数论] [逆元] [组合数取模]
- LightOJ-1102-组合数学,逆元
- 组合数简单求法(数论)
- 【转】逆元的几种求法
- 乘法逆元的快捷求法
- 乘法逆元的几种求法
- 逆元的两种求法
- 乘法逆元求法
- 逆元求法
- 逆元线性求法
- Lightoj 1067(逆元)
- 【Lightoj 1067】+ 逆元 + 预处理
- lightoj 1067 - Combinations 组合数取模
- 二叉树系列问题——判断一棵树是否为完全二叉树
- 策略模式
- 水仙花数
- HDU-2015
- 【框架学习】MVVM初探
- LightOJ - 1067 数论<100000左右的组合数取模求法《逆元》>
- bestcoder #86 第三题 NanoApe Loves Sequence Ⅱ hdu 5806
- Javascript实现列表中列的滚动效果
- hdu5805 NanoApe Loves Sequence 线段树 or 直接扫描
- 220. Contains Duplicate III
- ffmpeg命令参数详解(二)
- 十个免费的 Web 压力测试工具
- Android从入门到放弃3-线程
- Linux的文件权限和目录配置