大数取模 和 快速幂

2019-04-13 21:26发布

原文地址: http://blog.csdn.net/xr_acmer/article/details/10236081
大数取模模板:

while(scanf("%s", num) != EOF) { int len = strlen(num); __int64 ans = 0; for(int i = 0; i < len; ++i) { ans = ans*10 + (num[i]-'0'); ans %= MODZ; } }

针对数字位数超过最大整数范围限制的数进行取模操作,每次对一位取模 根据 (a+b)%mod=((a%mod)+(b%mod))%mod;把大数换为字符串处理,之后对每一位数字进行取模

原理(a*b)%mod=((a%mod)*(b%mod))%mod; 整数快速幂取模:(根据题意选择 long long还是mod某个数自己看着办) (可以ans=( (ans%mod)*(base%mod) )%mod
(base=( (base%mod)*(base%mod) )%mod
int poww(int a,int b){ int ans=1,base=a; while(b!=0){ if(b&1!=0)   ans*=base; base*=base; b=b>>1;   } return ans; }