2721: [Violet 5]樱花

2721: [Violet 5]樱花

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 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
",ans);
	return 0;
}

  


By NeighThorn

原文地址:https://www.cnblogs.com/neighthorn/p/6422368.html