hdu1452 积性函数(+逆元,快速幂)
积性函数定义:f(1)=1,当a,b互质时f(ab)=f(a)f(b)。
eg:1.f[n]:n的正因子个数
2.f[n]:n的正因子之和
3.gcd(n,k) k固定时n与k的最大公约数
4.φ(n) n的欧拉函数值(即小于n且与n互质数的数目)
此题满足第二个,即可拆分成几个素数,然后用等比数列求和,最后用逆元及快速幂搞定。
1 #include<stdio.h> 2 #include<string.h> 3 #define LL long long 4 void gcd(LL a,LL b,LL &d,LL &x,LL &y){ 5 if (!b) {d=a; x=1; y=0; } 6 else {gcd(b,a%b,d,y,x); y-=x*(a/b); } 7 } 8 LL quickpower(LL a,LL x,LL m) 9 { 10 LL ans=1; 11 a=a%m; 12 while (x!=0) 13 { 14 if (x%2) 15 ans=(ans*a)%m; 16 x/=2; 17 a=(a*a)%m; 18 } 19 return ans; 20 } 21 int main() 22 { 23 LL n,d,y,x1,x2,y1,y2,y3; 24 while (~scanf("%I64d",&n)&&n) 25 { 26 gcd(2,29,d,x1,y); x1=(x1+29)%29; 27 gcd(166,29,d,x2,y); x2=(x2+29)%29; 28 y1=(quickpower(2,2*n+1,29)-1+29)%29; 29 y2=(quickpower(3,n+1,29)-1+29)*x1%29; 30 y3=(quickpower(167,n+1,29)-1+29)*x2%29; 31 printf("%I64d\n",((y1*y2)%29*y3)%29); 32 } 33 }