1 条题解
-
0
自动搬运
来自洛谷,原作者为

yybyyb
**搬运于
2025-08-24 21:51:47,当前版本为作者最后更新于2018-01-12 09:21:22,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
忽然不知道这个要怎么表示。。。
就写成这样吧。。
$$\prod_{d=1}^n\prod_{i=1}^n\prod_{j=1}^mif(gcd(i,j)==d)f[gcd(i,j)] $$直接把提出来
$$\prod_{d=1}^{n}f[d]^{\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)==1]} $$上面那个东西用莫比乌斯反演+数论分块可以求
外面套的这一层也可以数论分块求
于是,我们就得到了一个的做法
但是显然还不够
把上面那坨东西拎出来看
太熟悉了
$$\sum_{i=1}^{n/d}\mu(i)[\frac{n}{id}][\frac{m}{id}] $$还是老套路,
令
直接把在整个式子里面提出来
$$\prod_{T=1}^{n}\prod_{d|T}f[d]^{[n/T][m/T]\mu(T/d)} $$有一些一样的东西
$$\prod_{T=1}^{n}(\prod_{d|T}f[d]^{\mu(T/d)})^{[n/T][m/T]} $$然后怎么办。。。。
很明显,已经可以对分块了
那。。。里面的东西怎么办。。。
又不能线性筛。。。
喂喂。。。不能线性筛就暴力算呀
数据范围
每个数暴力算到他的倍数里面去
也就是
这个东西也就是的样子
所以直接暴力把那个东西的前缀给求出来
就可以做到求解了
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<map> #include<vector> #include<queue> using namespace std; #define MOD 1000000007 #define MAX 1000000 inline int read() { int x=0,t=1;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=-1,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return x*t; } int fpow(int a,int b) { int s=1; while(b){if(b&1)s=1ll*a*s%MOD;a=1ll*a*a%MOD;b>>=1;} return s; } int f[MAX+10],pri[MAX],tot; int g[MAX+10]; int inv[MAX+10]; int F[MAX+10]; int mu[MAX+10]; bool zs[MAX+10]; int n,m; void pre() { f[1]=g[1]=F[0]=F[1]=1; mu[1]=1;zs[1]=true; for(int i=2;i<=MAX;++i) { f[i]=(f[i-1]+f[i-2])%MOD; g[i]=fpow(f[i],MOD-2);F[i]=1; if(!zs[i])pri[++tot]=i,mu[i]=-1; for(int j=1;j<=tot&&i*pri[j]<=MAX;++j) { zs[i*pri[j]]=true; if(i%pri[j])mu[i*pri[j]]=-mu[i]; else{break;} } } for(int i=1;i<=MAX;++i) { if(!mu[i])continue; for(int j=i;j<=MAX;j+=i) F[j]=1ll*F[j]*(mu[i]==1?f[j/i]:g[j/i])%MOD; } for(int i=2;i<=MAX;++i)F[i]=1ll*F[i]*F[i-1]%MOD; } int main() { pre(); int T=read(); while(T--) { n=read(),m=read(); if(n>m)swap(n,m); int i=1,j,inv,ans=1; while(i<=n) { j=min(n/(n/i),m/(m/i)); inv=1ll*F[j]*fpow(F[i-1],MOD-2)%MOD; ans=1ll*ans*fpow(inv,1ll*(n/i)*(m/i)%(MOD-1))%MOD; i=j+1; } printf("%d\n",(ans+MOD)%MOD); } return 0; }
- 1
信息
- ID
- 1299
- 时间
- 2000~3000ms
- 内存
- 125MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者