2721: [Violet 5]樱花
2721: [Violet 5]樱花
Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 547 Solved: 322
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
Source
分析:
考虑$y$大于$n!$,但是要求个数,所以不可能无限大,所以我们需要寻找的就是上界,考虑让$y=n!+t$,那么$\frac {1}{x}+\frac {1}{n!+t}=\frac {1}{n!}$...
然后化简一下:$n!(n!+t)+x(n!)=x(n!+t)-->x=\frac {n!(n!+t)}{t}-->x=\frac {(n!)^{2}}{t}+n!$...
所以个数就是$(n!)^{2}$的约数个数...
代码:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> //by NeighThorn using namespace std; const int maxn=1000000+5,mod=1e9+7; int n,cnt,vis[maxn],pri[maxn],num[maxn],Min[maxn]; inline void prework(void){ cnt=0; for(int i=2;i<=n;i++){ if(!vis[i]) pri[++cnt]=i,Min[i]=cnt; for(int j=1;j<=cnt&&pri[j]*i<=n;j++){ vis[i*pri[j]]=1,Min[i*pri[j]]=j; if(i%pri[j]==0) break; } } } inline void calc(int x){ while(x!=1) num[Min[x]]++,x/=pri[Min[x]]; } signed main(void){ scanf("%d",&n);prework(); for(int i=1;i<=n;i++) calc(i); long long ans=1LL; for(int i=1;i<=cnt;i++) (ans+=1LL*ans*num[i]%mod*2%mod)%=mod; printf("%lld\n",ans); return 0; }
By NeighThorn