Description Mato同學最近正在研究一種矩陣,這種矩陣有n行n列第i行第j列的數為gcd(i,j)。 例如n=5時,矩陣如下: 1 1 1 1 1 1 2 1 2 1 1 1 3 1 1 1 2 1 4 1 1 1 1 1 5 Mato想知道這個矩陣的行列式的值,你能求出來嗎? Mato ...
Submit: 386 Solved: 296
[Submit][Status][Discuss]
Description
Mato同學最近正在研究一種矩陣,這種矩陣有n行n列第i行第j列的數為gcd(i,j)。 例如n=5時,矩陣如下: 1 1 1 1 1 1 2 1 2 1 1 1 3 1 1 1 2 1 4 1 1 1 1 1 5 Mato想知道這個矩陣的行列式的值,你能求出來嗎?Input
一個正整數n mod1000000007 n<=1000000Output
n行n列的Mato矩陣的行列式。Sample Input
5Sample Output
16HINT
Source
Orz PoPoQQQ
高斯消元之後發現對角線是歐拉函數。。
然後就做完了。
// luogu-judger-enable-o2 #include<cstdio> #include<algorithm> #define LL long long using namespace std; const int MAXN = 1e7 + 10, mod = 1e9 + 7; int N; LL ans = 1; int prime[MAXN], tot, vis[MAXN], phi[MAXN]; void GetPhi(int N) { phi[1] = 1; for(int i = 2; i <= N; i++) { if(!vis[i]) prime[++tot] = i, phi[i] = i - 1; for(int j = 1; j <= tot && i * prime[j] <= N; j++) { vis[i * prime[j]] = 1; if(i % prime[j] == 0) phi[i * prime[j]] = phi[i] * prime[j]; else phi[i * prime[j]] = phi[i] * phi[prime[j]]; } } } int main() { scanf("%d", &N); GetPhi(1e6 + 10); for(int i = 1; i <= N; i++) ans = (1ll * ans * phi[i]) % mod; printf("%lld", ans); return 0; } /* 123 321 */