题目链接

  给你们讲个笑话:Konoset是个sb,他快速幂的时候把幂次取模了。

  原式差不多就是这样吧$\prod\limits_{i=1}^{n}\prod\limits_{j=1}^{m}f[gcd(i,j)]$

  然后我们枚举gcd(i,j)

  可以变换一下

  $\prod\limits_{w=1}^{min(n,m)}f[w]^{\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==w]}$

  然后上面那个玩意搞搞可以反演一下

  变为$\prod\limits_{w=1}^{min(n,m)}f[w]^{\sum\limits_{w|d}\mu(\frac{d}{w})\frac{n}{d}\frac{m}{d}}$

  上面那个玩意显然=$\sum\limits_{d}\mu(d)\frac{n}{dw}\frac{m}{dw}$

  然后枚举T=dw

  指数变为$\sum\limits_{\frac{T}{w}}\mu(\frac{T}{w})\frac{n}{T}\frac{m}{T}$

  然后把上面那个cigma搬到下面来

  变成累乘

  然后改成枚举T,中间预处理前缀积后面n除以Tm除以T的部分数论分块

  这题是真的恶心

  

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cctype>
#define maxn 1000020
#define mod 1000000007
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} long long fib[maxn];
long long sum[maxn];
long long mul[maxn];
long long ni[maxn];
int miu[maxn];
bool vis[maxn];
int prime[maxn],num; long long pow(long long n,long long x){
long long ans=;
while(x){
if(x&) ans=(ans*n)%mod;
n=(n*n)%mod;
x>>=;
}
return ans;
} int main(){
fib[]=;fib[]=vis[]=vis[]=miu[]=;
for(int i=;i<maxn;++i){
if(vis[i]==){
prime[++num]=i;
miu[i]=-;
}
for(int j=;j<=num&&i*prime[j]<maxn;++j){
vis[i*prime[j]]=;
if(i%prime[j]==) break;
miu[i*prime[j]]=-miu[i];
}
}
for(int i=;i<maxn;++i){
fib[i]=(fib[i-]+fib[i-])%mod;
sum[i]=;
}
sum[]=;
for(int i=;i<maxn;++i){
long long now=fib[i],ret=pow(now,mod-);
for(register int j=i;j<maxn;j+=i){
if(miu[j/i]==) sum[j]=(sum[j]*now)%mod;
else sum[j]=(sum[j]*ret)%mod;
}
}
mul[]=sum[];mul[]=;ni[]=ni[]=;
for(int i=;i<maxn;++i){
mul[i]=(sum[i]*mul[i-])%mod;
ni[i]=pow(mul[i],mod-);
}
int T=read();
while(T--){
long long n=read(),m=read();
int l=;long long ans=;int top=min(n,m);
while(l<=top){
int r=min(n/(n/l),m/(m/l));
ans*=pow(mul[r]*ni[l-]%mod,(n/l)*(m/l));
ans%=mod;
l=r+;
}
printf("%lld\n",ans);
}
return ;
}

  

最新文章

  1. Jvm --- 常用工具
  2. EEG preprocess - re-reference EEG预处理 - 重参考
  3. php 斐波那契数列
  4. webpack webpack-dev-server使用指南
  5. Windows nexus 启动失败
  6. Linux/Ubuntu下解压命令
  7. 基于Extjs的web表单设计器 第四节——控件拖放
  8. 四 主要的几种 Web 服务器
  9. linux 命令小结
  10. sql server varchar(10)和 nvarchar(10)存储数据长度
  11. [TPYBoard - Micropython之会python就能做硬件 8] 学习使用蓝牙模块及舵机
  12. Qt QLabel 大小随内容自动变化 &amp;&amp; 内容填充整个label空间
  13. AIDL基本使用
  14. JVM的常用的调优策略和垃圾回收算法及Tomcat的常用调优参数
  15. ASP.NET -- WebForm -- Cookie的使用 应用程序权限设计 权限设计文章汇总 asp.net后台管理系统-登陆模块-是否自动登陆 C# 读写文件摘要
  16. nginx 的一些优化
  17. Ubuntu修改时间时区
  18. python技巧 列表推导
  19. Job Interview: Why Only 3 Questions Really Matter
  20. Python中 list, numpy.array, torch.Tensor 格式相互转化

热门文章

  1. 记一次RabbitMq 安装和配置坑
  2. 【转】HTTP Live Streaming直播(iOS直播)技术分析与实现
  3. Ubuntu系统Apache 2部署SSL证书
  4. Bootstrap历练实例:默认的列表组
  5. Spring中使用事务搭建转账环境方法二 相对简便的注解方法 ——配置文件注入对象属性需要setter方法 注解方法,不需要生成setter方法
  6. 使用js将div高度设置为100%
  7. 【启发式拆分】bzoj4059: [Cerc2012]Non-boring sequences
  8. 模拟发送http请求的工具推荐
  9. Python学习笔记:time模块和datetime模块(时间和日期)
  10. IAR单片机启动文件与程序入口