数字表格

mobius反演。。。 
∏ni=1∏mj=1fi[gcd(i,j)] 
∏nk=1fi[k]∑ni=1∑mj=1[gcd(i,j)=k] 
设f(d)=∑ni=1∑mj=1[gcd(i,j)=k] ,表示最大公约数为k的数对数 
F(d)=?nd???md? 表示公约数为k的数对数 
根据莫比乌斯反演的公式f(d)=∑d|nμ(nd)?F(n) 
所以式子可以变成

∏k=1nfi[k]∑ni=1μ(i)??nk?i???mk?i?

但是实际上式子还能进一步的化简,设T=i?k

∏T=1n(∏d|nfi[d]μ(Td))?nT???mT?

设h(T)=∏d|nfi[d]μ(Td),h(T)可以预处理,那么回答询问的时间复杂度就是O(√n+√m)。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define lon long long
#define mod 1000000007
#define N 1000100
lon sum[N],f[N],inv[N],g[N];
int mu[N],pri[N],tot=0,n,m,vis[N];
lon ksm(lon x,int y){
    lon res=1;
    while(y){
        if(y&1)res=(res*x)%mod;
        x=(x*x)%mod;y>>=1;
    }
    return res;
}
void ycl(){
    f[0]=0;f[1]=1;
    for(int i=2;i<N;i++)f[i]=(f[i-1]+f[i-2])%mod;
    for(int i=1;i<N;i++)inv[i]=ksm(f[i],mod-2);
    mu[1]=1;
    for(int i=2;i<N;i++){
        if(!vis[i]){
            vis[i]=1;pri[++tot]=i;
            mu[i]=-1;
        }
        for(int j=1;((j<=tot)&&(i*pri[j]<N));j++){
            vis[i*pri[j]]=1;
            if(i%pri[j]==0){mu[i*pri[j]]=0;break;}
            mu[i*pri[j]]=-mu[i];
        }
    }
    for(int i=1;i<N;i++)g[i]=1;
    for(int i=1;i<N;i++)//g[i]
       for(int j=i;j<N;j+=i){
           if(mu[j/i]==1)g[j]=(g[j]*f[i])%mod;
           else if(mu[j/i]==-1)g[j]=(g[j]*inv[i])%mod;
       }
    sum[0]=1;
    for(int i=1;i<N;i++)
       sum[i]=(sum[i-1]*g[i])%mod;
}
int main(){
    lon ans,res,in;
    ycl();
    int t;scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        if(n>m)swap(n,m);//n==min(n,m)
        ans=1;int last;
        for(int i=1;i<=n;i=last+1){
            last=min(n/(n/i),m/(m/i));
            in=ksm(sum[i-1],mod-2);
            res=(sum[last]*in)%mod;
            ans=(ans*ksm(ksm(res,n/i),m/i))%mod;
        }
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-08-25 20:29:56

数字表格的相关文章

BZOJ 4816 数字表格

首先是惯例的吐槽.SDOI题目名称是一个循环,题目内容也是一个循环,基本上过几年就把之前的题目换成另一个名字出出来,喜大普奔亦可赛艇.学长说考SDOI可以考出联赛分数,%%%. 下面放解题报告.并不喜欢打莫比鸟斯的解题报告就是因为公式编辑太鬼. 不知道多少分算法:简单模拟不解释. 正解一眼是莫比鸟斯函数,话说上次考莫比鸟斯就是去年吧,好像题目名也叫数字表格,只不过多了一个前缀"Crash的". 慢慢推吧,这里公式编辑器好像坏了?雾,贼慢. 假设n<=m;(if(n>m)sw

BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][Discuss] Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究

【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&amp;&amp;BZOJ 2693 jzptab)

BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4*5的表格如下: 1 2 3 4 5 2 2 6 4

[Sdoi2017]数字表格

[Sdoi2017]数字表格 http://www.lydsy.com/JudgeOnline/problem.php?id=4816 Time Limit: 50 Sec  Memory Limit: 128 MB Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生成了一个n×m的表格,第i行第j列的格子中的数是f[gcd(i,j)],其

【BZOJ4816】[Sdoi2017]数字表格 莫比乌斯反演

[BZOJ4816][Sdoi2017]数字表格 Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生成了一个n×m的表格,第i行第j列的格子中的数是f[gcd(i,j)],其中gcd(i,j)表示i,j的最大公约数.Doris的表格中共有n×m个数,她想知道这些数的乘积是多少.答案对10^9+7取模. Input 有多组测试数据. 第一个一

【BZOJ 2154】Crash的数字表格 (莫比乌斯+分块)

2154: Crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4*5的表格如下: 1 2 3 4 5 2 2 6 4 10 3

BZOJ 4816: [Sdoi2017]数字表格

二次联通门 : BZOJ 4816: [Sdoi2017]数字表格 /* BZOJ 4816: [Sdoi2017]数字表格 莫比乌斯反演 妈呀,我的μ没有啦 */ #include <cstdio> #include <iostream> #define rg register #define Max 1000050 #define mo 1000000007 inline int min (int a, int b) { return a < b ? a : b; } i

Crash的数字表格(莫比乌斯反演)

Crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张NM的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4 5的表格如下: 1 2 3 4 5 2 2 6 4 10 3 6 3 12

[BZOJ4816][SDOI2017]数字表格(莫比乌斯反演)

4816: [Sdoi2017]数字表格 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1259  Solved: 625[Submit][Status][Discuss] Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生成了一个n×m的表格,第i行第j列的格子中的数是f[gcd(i,j)

[bzoj 2154]Crash的数字表格

Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4*5的表格如下: 1 2 3 4 5 2 2 6 4 10 3 6 3 12 15 4 4 12