JZOJ 3456. 【NOIP2013模拟联考3】恭介的法则(rule)
题目
分析
- 来手推一下
- T2:先移项:
又x,y,n!为正整数
设
则
所以k|(n!)^2+n!k
所以k|(n!)^2
- 然后我们求约数个数就是
- 首先如果求n的因子个数
- 那么我们就是分解质因数
-
至于怎么算每个质数p出现的次数,p的次数等于[n/p]+[n/p^2]+[n/p^3]+….这个可以看成是把1~n里p的倍数的数字都除掉一个p,这样的数有[n/p]个
-
除完之后这[n/p]个数会变成1~[n/p],然后再除掉一个p,就是[[n/p]/p]个,然后变成1~[n/p^2],一直做下去。
代码
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const long long md=1000000000; 5 int n,sum,num=1,vis[700002]; 6 unsigned long long s[1000002],f[10000002]; 7 void calc(long long x) 8 { 9 int p=0; 10 for (int i=1;i<=num;i++) 11 { 12 s[i]=s[i]*x+p; 13 p=s[i]/md; 14 s[i]%=md; 15 } 16 while (p) s[++num]=p%md,p/=md; 17 } 18 int main () 19 { 20 int n; 21 cin>>n; 22 s[1]=1; 23 long long k=1; 24 for (int i=2;i<=n;i++) 25 if (!vis[i]) 26 { 27 for (int j=1;j<=n/i;j++) vis[i*j]=1; 28 int t=n/i,t1=0; 29 while (t) t1+=t,t/=i; 30 t1=t1*2+1; 31 if (k*t1>md) 32 { 33 calc(k); 34 k=1; 35 } 36 k*=t1; 37 } 38 if (k>1) calc(k); 39 printf("%lld",s[num]); 40 for (int i=num-1;i>=1;i--) 41 printf("%09lld",s[i]); 42 }
为何要逼自己长大,去闯不该闯的荒唐