zoukankan      html  css  js  c++  java
  • [洛谷]P3704-数字表格

    [洛谷]P3704-数字表格

    妙啊,这又是一道反演题,而且个人感觉比较高级

    传送门


    大意

    (N imes M)的数表(a)中,(a_{i,j})表示f((i,j)),其中((i,j))表示(i)(j)的最大公约数,(f)(fibnaci)数列
    求$$prod_{i=1}Nprod_{j=1}M a_{i,j}$$


    那么显然这又是一个褪柿子的题QwQ,于是我们可以开心的推这个奇怪的柿子


    为了便于书写,我们令(N<=M)

    [prod_{i=1}^Nprod_{j=1}^Mprod_{d=1}^N[(i,j)==d]f(d) ]

    稍微换下位置,有

    [prod_{d=1}^Nf(d)prod_{i=1}^Nprod_{j=1}^M[(i,j)==d] ]

    也就是说(f(d))被乘了后面这么多次

    [prod_{d=1}^Nf(d)^{sum_{i=1}^Nsum_{j=1}^M[(i,j)==d]} ]


    指数上的柿子是个非常经典了老问题了,我们小小的复习一下
    令$$f(d)={sum_{i=1}Nsum_{j=1}M[(i,j)==d]}$$
    这里的(f(d))与原问题中的(f)不重合,只是我们中间推理用的字母。
    设$$F(n)=sum_{n|d} f(d)$$,则有

    [F(n)=lfloorfrac{N}{n} floorlfloorfrac{M}{n} floor ]

    反演一下

    [f(n)=sum_{n|d}mu(frac{d}{n})F(d) ]

    往一开始的柿子上看,显然指数就为(f(d))

    [f(d)=sum_{d|k}mu(frac{k}{d})lfloorfrac{N}{k} floorlfloorfrac{M}{k} floor ]

    更换求和指标,我们枚举(frac{k}{d})

    [sum_{t=1}^nmu(t)lfloorfrac{N}{td} floorlfloorfrac{M}{td} floor ]

    这就差不多了,我们带回初始柿子。


    [Ans=prod_{d=1}^Nf(d)^{sum_{t=1}^nmu(t)lfloorfrac{N}{td} floorlfloorfrac{M}{td} floor} ]

    考虑把这个(sum)拽下来(为什么能这么做呢,因为你考虑,(a^{x+y}=a^x imes a^y),所以这个(sigma)拽下来也没啥影响

    [Ans=prod_{d=1}^Nprod_{t=1}^{frac{n}{d}}f(d)^{mu(t)lfloorfrac{N}{td} floorlfloorfrac{M}{td} floor} ]

    更换下求和指标,我们枚举(td=T)

    [prod_{T=1}^Nprod_{t|T}f(t)^{mu(frac{T}{t})lfloorfrac{N}{T} floorlfloorfrac{M}{T} floor} ]

    发现这个大概可能是整出分块,但是中间的东西比较棘手,我们把一些东西提出来

    [prod_{t|T}f(t)^{mu(frac{T}{t})} ]

    发现这个东西没法线筛,那我们直接暴力算他,每一次计算为(log_n),把这块东西叫做(g(t))
    就有

    [prod_{T=1}^N g(T)^{lfloorfrac{N}{T} floorlfloorfrac{M}{T} floor} ]


    这个东西就可以(O(n))的做了,但是该死的出题人还有多组数据,考虑整除分块
    发现我们可以预处理(g(T))的前缀积,用(frac{P[r]}{P[l-1]})就能求出区间积了
    注意有取模,(mu)的取值可能有(-1),所以要预先求出(f(t))的逆元,整除分块的时候也要求出(P[l-1])的逆元
    细节方面关于(exp)的参数一定要用(long long),因为(lfloorfrac{N}{T} floorlfloorfrac{M}{T} floor)这个会爆(int)
    而且洛谷这样的不会显示(RE),而是(MLE)(手动黑人问号脸),就很难搞


    上代码

    #include<bits/stdc++.h>
    using namespace std;
    const int Mod=1000000007,
    		  maxn=1000010;
    typedef long long LL;
    int n,m;
    LL ans;
    
    LL exp(LL b,LL p){
    	if (p==1) return b%Mod;
    	LL temp=exp(b,p>>1);
    	temp=(LL)(temp*temp)%Mod;
    	if (p&1) temp=((LL)temp*(b%Mod))%Mod;
    	return temp;
    }
    
    int mu[maxn],vis[maxn],pri[maxn];
    LL f[maxn],F[maxn];//f->fibonaci;    F:f & Mod _ Ni Yuan
    int cnt=0;
    
    inline void getmiu(LL n){
    	mu[1]=1;vis[1]=1;F[1]=1;cnt=0;
    	f[0]=0;f[1]=1;
    	for (int i=2;i<=n;i++){
    		f[i]=(f[i-1]+f[i-2])%Mod;
    		F[i]=exp(f[i],Mod-2);
    		if (!vis[i]){
    			mu[i]=-1;
    			pri[++cnt]=i;
    		}
    		for (int j=1;j<=cnt&(LL)i*pri[j]<=n;j++){
    			vis[i*pri[j]]=1;
    			if (i%pri[j]==0) break;
    			else mu[i*pri[j]]=-mu[i];
    		}
    	}
    }
    
    inline int read()
    {
        char s;
        int k=0,base=1;
        while((s=getchar())!='-'&&s!=EOF&&!(isdigit(s)));
        if(s==EOF)exit(0);
        if(s=='-')base=-1,s=getchar();
        while(isdigit(s)){k=k*10+(s^'0');s=getchar();}
        return k*base;
    }
    
    LL g[maxn];//g[T]=prod _{t|T}f(t)^{mu(frac{T}{t})} 
    inline void solve(LL n){
    	for (int i=0;i<=n;i++) g[i]=1;
    	for (int i=1;i<=n;i++){
    		for (int j=i;j<=n;j+=i){//枚举i的倍数
    			if (!mu[j/i]) continue;
    			if (mu[j/i]==1) g[j]=(LL)g[j]*f[i]%Mod;
    			else if (mu[j/i]==-1) g[j]=(LL)g[j]*F[i]%Mod;
    		} 
    	}
    	//for (LL i=1;i<=100;i++) prLLf("%d %d %d
    ",f[i],F[i],g[i]);
    	for (int i=2;i<=n;i++) g[i]=(LL)g[i-1]*g[i]%Mod;
    }
    
    int main(){
    	int t=read();
    	getmiu(1000000);
    	solve(1000000);
    	//for (LL i=1;i<=100;i++) prLLf("%d
    ",g[i]);
    	while (t--){
    		n=read();m=read();
    		ans=1;
    		for (int l=1,r;l<=min(n,m);l=r+1){
    			r=min(n/(n/l),m/(m/l));
    			LL delta=g[r]*exp(g[l-1],Mod-2)%Mod;
    			ans=(LL)ans*exp(delta,(LL)(n/l)*(m/l))%Mod;
    		}
    		printf("%lld
    ",ans);
    	}
    }
    
  • 相关阅读:
    关于grunt
    关于网页上标题图标显示
    form表单原理
    js判断是android访问还是ios访问
    判断客户端是手机访问还是电脑访问网站(php代码)
    电脑手机模拟器模拟手机浏览器,在线浏览手机网站
    手机网站通过JS判断是否为iPhone手机访问
    手机页面一键拨号
    html5手机网站常用的9个CSS属性
    js解析与序列化json数据(一)json.stringify()的基本用法
  • 原文地址:https://www.cnblogs.com/ugly-CYW-lyr-ddd/p/9253270.html
Copyright © 2011-2022 走看看