日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

数字表格

發布時間:2023/12/13 综合教程 20 生活家
生活随笔 收集整理的這篇文章主要介紹了 数字表格 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本人第一道數論黑題,雖然有些參照題解,但是頗有收獲。

首先可以將問題轉化為求一下式子:

[prodlimits_{k=1}^nf_k^{sumlimits_{i=1}^nmu(i)left[frac{n}{ik}ight]left[frac{m}{ik}ight]}
]

顯然這個式子是可以分塊求解的,但是太慢了。

學到一個套路。令(T=ik),調換一下順序成這樣:

[prodlimits_{T=1}^nprodlimits_{d|T}f_d^{mu(frac{T}ozvdkddzhkzd)left[frac{n}{T}ight]left[frac{m}{T}ight]}
]

發現有些東西可以提出來:

[prodlimits_{T=1}^nleft(prodlimits_{d|T}f_d^{mu(T/d)}ight)^{left[frac{n}{T}ight]left[frac{m}{T}ight]}
]

對于每一個,可以暴力預處理(prodlimits_{d|T}f_d^{mu(T/d)}),對于整體直接分塊就好了!

奉上代碼:

#include<bits/stdc++.h>
typedef long long ll;
const int maxn=1e6;
const int mod=1e9+7;
ll f[maxn+10],g[maxn+10];int t,n,m;
int mu[maxn+10],flag[maxn+10],pri[maxn+10],cnt;
inline ll ksm(ll x,ll y){
	ll ans=1;
	while(y){
		if(y&1)ans=(ans*x)%mod;
		x=(x*x)%mod;y>>=1;
	}
	return ans;
}
inline int read(){
	int x=0;char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x;
}
signed main(){
	g[0]=f[1]=f[2]=1;
	for(int i=3;i<=maxn;i++)
		f[i]=(f[i-1]+f[i-2])%mod;
	mu[1]=1;
	for(int i=2;i<=maxn;i++){
		if(!flag[i])mu[i]=-1,pri[++cnt]=i;
		for(int j=1;j<=cnt&&pri[j]*i<=maxn;j++){
			flag[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<=maxn;i++)g[i]=1;
	for(int i=1;i<=maxn;i++)
		for(int j=1;j*i<=maxn;j++){
			if(mu[j]==0)continue;
			if(f[i]==0)g[i*j]=0;
			else if(mu[j]==1)g[i*j]=(g[i*j]*f[i])%mod;
			else g[i*j]=(g[i*j]*ksm(f[i],mod-2))%mod;
		}
	for(int i=2;i<=maxn;i++)
		g[i]=(g[i]*g[i-1])%mod;
	t=read();
	while(t--){
		n=read(),m=read();
		ll ans=1;
		if(n>m)std::swap(n,m);
		for(register int l=1,r;l<=n;l=r+1){
			r=std::min(n/(n/l),m/(m/l));
			ll tot=g[r]*ksm(g[l-1],mod-2)%mod;
			ans=(ans*ksm(tot,1ll*(n/l)*(m/l)%(mod-1)))%mod;
			//printf("l=%d
",l);
		}
		printf("%lld
",ans);
	}
	return 0;
}

深深地感到自己的弱小。

總結

以上是生活随笔為你收集整理的数字表格的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。