2721: [Violet 5]樱花
Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 547 Solved: 322
[Submit][Status][Discuss]
Description
.gif)
Input
.gif)
Output
.gif)
Sample Input
Sample Output
HINT
.gif)
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
",ans);
return 0;
}
By NeighThorn