题目大意:给定一个n阶行列式,第i行第j列为GCD(i,j),求这个行列式的值
高斯消元之后发现对角线上的东西是phi
于是线性筛出所有的欧拉函数即可
/* #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 110 using namespace std; int n; double f[M][M]; void Gauss_Elimination() { int i,j,k; for(i=1;i<=n;i++) { k=0; for(j=i;j<=n;j++) if( fabs(f[j][i])>fabs(f[k][i]) ) k=j; for(j=i;j<=n;j++) swap(f[i][i],f[k][i]); for(j=i+1;j<=n;j++) { double temp=-a[j][i]/a[i][i]; for(k=i;k<=n;k++) a[j][k]+=a[i][j]*temp; } } } int main() { int i,j; while(cin>>n) { memset(f,0,sizeof f); for(i=1;i<=n;i++) for(j=1;j<=n;j++) f[i][j]=__gcd(i,j); Gauss_Elimination(); for(i=1;i<=n;i++) for(j=1;j<=n;j++) printf("%d%c",int(f[i][j]+1e-7)," \n"[j==n]); } return 0; } */ #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 1001001 #define MOD 1000000007 using namespace std; int n; long long ans=1; int phi[M],prime[100100],tot; bool not_prime[M]; void Linear_Shaker() { int i,j; phi[1]=1; for(i=2;i<=1000000;i++) { if(!not_prime[i]) { prime[++tot]=i; phi[i]=i-1; } for(j=1;prime[j]*i<=1000000;j++) { not_prime[prime[j]*i]=1; if(i%prime[j]==0) { phi[prime[j]*i]=phi[i]*prime[j]; break; } phi[prime[j]*i]=phi[i]*(prime[j]-1); } } } int main() { int i; Linear_Shaker(); cin>>n; for(i=1;i<=n;i++) ans*=phi[i],ans%=MOD; cout<<ans<<endl; return 0; }
原文地址:http://blog.csdn.net/popoqqq/article/details/42550761