记录编号 336386 评测结果 AAAAAAAAAA
题目名称 最小生成树 最终得分 100
用户昵称 Gravatar‎MistyEye 是否通过 通过
代码语言 C++ 运行时间 0.025 s
提交时间 2016-11-03 08:18:42 内存使用 0.49 MiB
显示代码纯文本
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int maxn = 20005, mod = 100000007;
bool isnotprime[maxn]={1,1};
int prime[maxn], P;
int phi[maxn];
ll preprocess(int n) {
	phi[1] = 1;
	for(int i=2; i<=n; ++i) {
		if(!isnotprime[i]) {
			prime[++P] = i;
			phi[i] = i-1;
		}
		for(int j=1; j<=P && i*prime[j]<=n; ++j) {
			isnotprime[i*prime[j]] = 1;
			if(i%prime[j]==0) {
				phi[i*prime[j]] = phi[i]*prime[j];
				break;
			} else 
				phi[i*prime[j]] = phi[i]*(prime[j]-1);
		}
	}
	ll ans = 1;
	for(int i=2; i<=n; ++i) ans *= phi[i], ans %= mod;
	return ans;
}

int main() {
	freopen("msta.in","r",stdin);
	freopen("msta.out","w",stdout);
	int N; 
	scanf("%d", &N);
	printf("%lld\n", preprocess(N));
	getchar(), getchar();
	return 0;
}