数论专题 hdu1452
本题题意:求2004^X的因子和。
代码如下:
#include <cstdio> using namespace std; const int MAX = 10000000; const int mod = 29; typedef long long ll; int a[MAX+1]; int num[] = {2,3,167}; int t[3] = {2,1,1}; ll me(ll a,ll p) { ll base = a,sum = 1; while(p) { if(p&1)sum=sum*base%mod; base = base * base % mod; p >>= 1; } return sum % mod; } ll inv(int a,int p) { return me(a,p-2)%p; } ll g(int prime,int e) { return (me(prime,e+1)-1)*inv((prime-1),mod); } ll calculate(int a,int b,int c) { return g(2,a) * g(3,b) * g(167,c)%mod; } int main() { int X; while(scanf("%d",&X)&&X) { printf("%lld\n",calculate(X*t[0],X*t[1],X*t[2])); } return 0; }
这道题又是一个公式题,任意数n都能化成 p1^e1*p2^e2*...pn^en的形式,其中pi为第i个素数,ei为pi出现的次数,然后n又可以化成p1^e1*n'。(n'即除了p1外其他素数的乘积)。