BZOJ3288 Mato矩阵

网上说高斯消元得到下三角矩阵然后都是phi(i)...反着我是搞不出来

打个表什么的还是能看出来点奇怪的东西,比如后面能整除前面的,然后再乱搞吧2333

 1 /**************************************************************
 2     Problem: 3288
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:304 ms
 7     Memory:9596 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11
12 using namespace std;
13 typedef long long ll;
14 const int N = 1e6 + 5;
15 const int mod = 1e9 + 7;
16
17 int n;
18 ll ans = 1;
19 int phi[N], p[N], cnt;
20 bool f[N];
21
22 void get_phi(int N) {
23     int i, j, k;
24     for (phi[1] = 1, i = 2; i <= N; ++i) {
25         if (!f[i]) p[++cnt] = i, phi[i] = i - 1;
26         for (j = 1; j <= cnt; ++j) {
27             if ((k = i * p[j]) > N) break;
28             f[k] = 1;
29             if (i % p[j] == 0) {
30                 phi[k] = phi[i] * p[j];
31                 break;
32             }
33             phi[k] = phi[i] * (p[j] - 1);
34         }
35     }
36 }
37
38 int main() {
39     int i;
40     scanf("%d", &n);
41     get_phi(n);
42     for (i = 1; i <= n; ++i)
43         (ans *= phi[i]) %= mod;
44     printf("%lld\n", ans);
45     return 0;
46 }

时间: 2024-10-29 19:07:51

BZOJ3288 Mato矩阵的相关文章

BZOJ 3288 Mato矩阵 线性筛

题目大意:一个M*M的矩阵,(i,j)位置上的值是gcd(i,j),问这个矩阵的行列式的值. 思路:考试的时候考了这个题,有人居然打表发现规律,简直跪啊... 其实用高斯消元之后不难发现,要求的就是从1到m的phi的乘积,一个线性筛就解决了. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 1000010 #defi

BZOJ 3288: Mato矩阵

Description 一个 \(n*n\) 行列式,\((i,j)=gcd(i,j)\) Sol 线性筛. 这道题神奇的筛出来 \(phi\) ... 打表可以发现,一个数会被他所有的因子减掉因子的 \(phi\) ... 然后我就不会证明了... Code /************************************************************** Problem: 3288 User: BeiYu Language: C++ Result: Accepte

BZOJ 3288 Mato矩阵 解题报告

这个题好神呀..Orz taorunz 有一个结论,这个结论感觉很优美: $$ans = \prod_{i=1}^{n}\varphi(i)$$ 至于为什么呢,大概是这样子的: 对于每个数字 $x$,第 $x$ 行有 $x - \varphi(x)$ 个数字不为 $1$,则说明这一行要被消 $x - \varphi(x)$ 次(别忘了每一行都会被 $1$ 给消一次),每次消元都会令 $A[x][x]$ 减一,所以 $A[x][x]$ 最后会变成 $\varphi(x)$,所以答案就是这个啦. 时

【3288】Mato矩阵 打表找规律

首先行列式不多说了. 然后这道题可以用类似高斯消元的方法暴力搞到部分分. 但是正解是1~n求一遍欧拉函数,乘起来就是答案了. 这个怎么搞出来的呢? 考试的时候首先我们会打个暴力,然后排一下,然后发现,,,欧拉函数! 嗯.就是这样. 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 1001000 #define MOD 100

矩阵乘法的Strassen算法详解

题目描述 请编程实现矩阵乘法,并考虑当矩阵规模较大时的优化方法. 思路分析 根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵B的列数和另一个矩阵A的行数相等时才能定义.如A是m×n矩阵和B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p. 值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了: 下面咱们来具体解决这个矩阵相乘的问题. 解法一.暴力解法 其实,通过前面的分析

*C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)

最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行的,这个工具条主要功能是:一个工具条,可进行拖拉.可进行拖拉展开,可在拖动之后不足展开并反向继续展开剩下的部分: 一.[拖动]   拖动的核心代码是通过矩阵进行定位和拖动的,定位是以父容器为模板的.以下是核心代码(及效果图): 1 /// <summary> 2 /// 这里TitleBar代指最

矩阵快速幂刷题系列

来源自http://blog.csdn.net/chenguolinblog/article/details/10309423 hdu 1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5587    Accepted Submission(s): 4200 Problem Description A为一个方阵,则Tr

51nod 1137 矩阵乘法

基本的矩阵乘法 中间for(int j=0;i<n;i++)  //这里写错了   应该是j<n 晚上果然  效率不行 等会早点儿睡 //矩阵乘法 就是 两个矩阵 第一个矩阵的列 等与 第二个矩阵的行相同 // 然后ans[i][j] += a[i][k] * b[k][j]; #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 150; int n; ll a[ma

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6155 Subsequence Count 矩阵快速幂

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6155 题意: 题解来自:http://www.cnblogs.com/iRedBean/p/7398272.html 先考虑dp求01串的不同子序列的个数. dp[i][j]表示用前i个字符组成的以j为结尾的01串个数. 如果第i个字符为0,则dp[i][0] = dp[i-1][1] + dp[i-1][0] + 1,dp[i][1] = dp[i-1][1] 如果第i个字符为1,则dp[i][1