[SDOI2017]數字表格-數論
題意簡述
我們定義為斐波那契數列,那麼
組詢問,每次給定詢問下面式子的值在模後的答案。
還是莫比烏斯反演的套路,雖然變成了累乘,但是做法還是類似的,我們列舉,然後式子就可以變成(這裡預設,不滿足則交換):
這裡相當於每一個都會被乘次,可以預處理,主要是指數還不好處理,所以我們接下來對指數進行反演,可以得到:
然後我們將其帶回原式得到:
把上面的一個拿下來,可以得到:
然後我們可以的預處理函式和其字首積,然後對於外面的數論分塊即可。而對於每次提取中間一段的乘積,我們用逆元將前面的除去即可。
複雜度
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int M=1e6+10;
const ll Mod=1e9+7;
bool vis[M];
int n,m;
ll prime[M],f[M],F[M],mu[M],cnt,inv[M],MAX=1e6;
ll fpow(ll a,ll b){
ll res=1;
for(;b;b>>=1,a=(a*a)%Mod){
if(b&1)res=(res*a)%Mod;
}
return res;
}
void init(){
F[0]=mu[1]=F[1]=f[1]=inv[1]=1;
inv[0]=mu[0]=1;
for(int i=2;i<=MAX;i++){
F[i]=1;
f[i]=(f[i-1]+f[i-2])%Mod;
inv[i]=fpow(f[i],Mod-2);
if(!vis[i]){
prime[++cnt]=i;
mu[i]=-1;
}
for(int j=1,v;j<=cnt&&i*prime[j]<=MAX;j++){
v=i*prime[j];
vis[v]=1;
if(!(i%prime[j])){
break;
}
mu[v]=-mu[i];
}
}
for(int i=1;i<=MAX;i++){
if(!mu[i]) continue;
for(int j=i;j<=MAX;j+=i){
if(mu[i]==-1)F[j]=F[j]*inv[j/i]%Mod;
else F[j]=F[j]*f[j/i]%Mod;
}
}
for(int i=2;i<=MAX;i++)
F[i]=(F[i]*F[i-1])%Mod;
}
ll solve(){
if(n>m)swap(n,m);
ll ans=1;
for(ll i=1,j;i<=n;i=j+1){
j=min(n/(n/i),m/(m/i));
ans=(ans*fpow((F[j]*fpow(F[i-1],Mod-2)%Mod)%Mod,1ll*(n/i)*(m/i)))%Mod;
}
return ans;
}
int T;
int main(){
init();
for(scanf("%d",&T);T--;){
scanf("%d%d",&n,&m);
printf("%lld\n",solve());
}
return 0;
}
相關文章
- word怎麼設定表格數字水平居中 word設定表格數字居中的方法
- excel表格數字怎麼變成正常數字 數字太長後面變成000Excel
- 數論——數論分塊
- excel下拉數字不遞增只複製 excel表格下拉數字不遞增怎麼操作Excel
- “2021數字基建論壇”熱議傳統產業數字化轉型產業
- 企業數字化悖論與對策
- 數論——質數與約數
- 數論(1):素數
- 數學 之 數論
- 數論
- 資訊 | 圖撲應邀出席“數字孿生•築夢末來”數字工程論壇
- 2021數字孿生高峰論壇,柏睿資料眼中的數字經濟新生態
- 數學——數論/雜項
- 【數論】素數篩法
- 模板 - 數論
- 數論板子
- 數學 in OI-數論-1
- 世界經濟論壇:東盟數字世代報告
- 世界經濟論壇:2024年數字信任報告
- 雲棲科技評論|數字時代需要雙螺旋
- 智慧表格識別介面-翔雲C#表格識別對接開啟企業數字化管理C#
- 數字化,正當時 | 2022零售數字化創新論壇與您相約雲端
- 數字,小數點正則,一段話提取數字
- 離散數學(數論基礎)
- 基礎數論
- 數論相關
- 數論,但是板子
- 數論小記
- 猜數字
- 數字序列
- 數字藏品
- 數字宋朝
- 數字加密加密
- 中文數字與阿拉伯數字:數字符號的文化交融符號
- 羅馬數字轉整數
- jquery金額數字轉為大寫數字jQuery
- 中文數字阿拉伯數字相互轉換
- 衡量數字發展:事實和數字2020