【bzoj3288】Mato矩阵 线性筛法

然而是结论题,高斯消元后对角线上的数是phi


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
#define maxn 1000010 
#define mod 1000000007

using namespace std;

int f[maxn];
int prime[maxn],phi[maxn];
bool vis[maxn];
int ans,n,tot;

int main()
{
	scanf("%d",&n);
	phi[1]=1;
	for (int i=2;i<=n;i++)
	{
		if (!vis[i])
		{
			phi[i]=i-1;
			prime[++tot]=i;
		}
		for (int j=1;j<=tot && prime[j]*i<=n;j++)
		{
			vis[i*prime[j]]=1;
			if (i%prime[j]==0)
			{
				phi[i*prime[j]]=phi[i]*prime[j];
				break;
			}
			phi[i*prime[j]]=phi[i]*(prime[j]-1);
		}
	}
	ans=1;
	for (int i=2;i<=n;i++) ans=(long long)ans*phi[i]%mod;
	printf("%d\n",ans);
	return 0;
}


你可能感兴趣的:(【bzoj3288】Mato矩阵 线性筛法)