【bzoj3288】Mato矩阵
题目大意:给定一个n阶行列式,第i行第j列为GCD(i,j),求这个行列式的值
高斯消元之后发现对角线上的东西是phi
于是线性筛出所有的欧拉函数即可
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<queue> 8 using namespace std; 9 10 typedef long long LL; 11 12 #define MOD 1000000007 13 #define N 1000010 14 15 int n; 16 int cnt; 17 LL ans=1; 18 19 LL phi[N]; 20 int prime[N]; 21 22 bool vis[N]; 23 24 void init() 25 { 26 phi[1]=1; 27 for (int i=2;i<=n;i++) 28 { 29 if (!vis[i]) 30 prime[++cnt]=i,phi[i]=i-1; 31 for (int j=1;prime[j]*i<=n;j++) 32 { 33 vis[prime[j]*i]=true; 34 if (i%prime[j]==0) 35 { 36 phi[prime[j]*i]=phi[i]*prime[j]; 37 break; 38 } 39 phi[prime[j]*i]=phi[i]*(prime[j]-1); 40 } 41 } 42 } 43 44 int main() 45 { 46 scanf("%d",&n); 47 init(); 48 for (int i=1;i<=n;i++) 49 ans=ans*phi[i]%MOD; 50 printf("%lld",ans); 51 return 0; 52 }
一开始看题表示不会矩阵的行列式的值,于是搜了一下,发现求起来比较复杂。于是继续翻,发现一种可以这样搞
这里有一个ppt
http://wenku.baidu.com/link?url=fhxojDfArV5O6LtsJhOeS0l9za3jv58NRPciTQztWba_7X3bNw7dM3Kguxy8Qz2Okf_ohZ5rcf2QNNILrxQwtqKcAHZaQRglP6u1gYJYZ7C