BZOJ 3288: Mato矩阵

Description

一个 \(n*n\) 行列式,\((i,j)=gcd(i,j)\)

Sol

线性筛.

这道题神奇的筛出来 \(phi\) ...

打表可以发现,一个数会被他所有的因子减掉因子的 \(phi\) ...

然后我就不会证明了...

Code

/**************************************************************
    Problem: 3288
    User: BeiYu
    Language: C++
    Result: Accepted
    Time:432 ms
    Memory:9100 kb
****************************************************************/

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N = 1e6+50;
const LL p = 1e9+7;

int n;LL ans;
int pr[N],cp;
int phi[N];

void Pre() {
    phi[1]=1,ans=1;
    for(int i=2;i<=n;i++) {
        if(!phi[i]) phi[i]=i-1,pr[++cp]=i;
        for(int j=1;j<=cp && (LL)pr[j]*i<=n;j++) {
            if(i%pr[j]) {
                phi[i*pr[j]]=phi[i]*(pr[j]-1);
            }else {
                phi[i*pr[j]]=phi[i]*pr[j];
            }
        }
    }
//  for(int i=1;i<=n;i++) cout<<phi[i]<<" ";cout<<endl;
    for(int i=1;i<=n;i++) ans=(ans*phi[i])%p;
}

int main() {
    cin>>n;
    Pre();
    cout<<ans<<endl;
    return 0;
}
时间: 2024-10-11 05:09:16

BZOJ 3288: 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矩阵 解题报告

这个题好神呀..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)$,所以答案就是这个啦. 时

bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配

1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1891  Solved: 919[Submit][Status] Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作:行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩阵

【3288】Mato矩阵 打表找规律

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

BZOJ 3289 Mato的文件管理(莫队+离散化求逆序数)

3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 2171  Solved: 891 [Submit][Status][Discuss] Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的,只能用Mato自己写的程序才能访问.Mato每天随机选一个区间[l,r],他今天就看编号在此区间内的这些资料.M

【BZOJ 2738】 矩阵乘法

2738: 矩阵乘法 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 841 Solved: 351 [Submit][Status][Discuss] Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Input 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N*N个数,表示这个矩阵: 再接下来Q行每行5个数描述一个询问:x1,y1,x2,y2,k表示找到以(x1,y1)为左上角.

BZOJ 2462: [BeiJing2011]矩阵模板

2462: [BeiJing2011]矩阵模板 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 915  Solved: 432[Submit][Status][Discuss] Description 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.    所谓01矩阵,就是矩阵中所有元素不是0就是1. Input 输入文件的第一行为M.N.A.B,参见题目描述. 接下来M行,每行N个字符,非0即1

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 ********

BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Discuss] Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的,只能用Mato自己写的程序才能访问.Mato每天随机选一个区间[l,r],他今天就看编号在此区间内的这些资料.Mat