比赛 20160420s 评测结果 WWWWWWWWWW
题目名称 最小生成树 最终得分 0
用户昵称 WAHT 运行时间 0.006 s
代码语言 C++ 内存使用 1.84 MiB
提交时间 2016-04-20 11:38:30
显示代码纯文本
#include <iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=100010;
#define ll long long
int phi[maxn],prime[maxn];
ll mod=100000007;
int main()
{
	freopen("msta.in","r",stdin);
	freopen("msta.out","w",stdout);
	int n;
	cin>>n;
	for(int i=2;i<=n;i++)
		prime[i]=1;
	for(int i=2;i*i<=n;i++)
	{
		if(prime[i])
			for(int j=i*i;j<=n;j+=i)
				prime[j]=0;
	} //这段求出了n内的所有素数
	for(int i=1;i<=n;i++)	phi[i]=i;
	for(int i=2;i<=n;i++)
		if(prime[i])
			for(int j=i;j<=n;j+=i)
			phi[j]=phi[j]/i*(i-1); //此处注意先/i再*(i-1),否则范围较大时会溢出
	ll ans=1;
	for(int i=2;i<=n;i++)	ans=ans*phi[i]%mod;
	cout<<ans<<endl;
}