【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

  

posted @ 2016-05-17 19:27  Yangjiyuan  阅读(238)  评论(0编辑  收藏  举报