传送门
显然枚举gcd是正确选择。
然后莫比乌斯反演一下求出互质的数的个数。
用分块显然时间复杂度是O(T*N);
然后愉快的tle了。

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 1000005
#define mo 1000000007
using namespace std;
ll f[N],inv[N],ans,x,y;
int fl[N],mu[N],pri[N/5],T,n,m,tot;
void exgcd(ll a,ll b){if (!b) return;exgcd(b,a%b);swap(x,y);y-=a/b*x;
}
ll P(ll x,ll y){//printf("P %lld %lld",x,y);ll s=1;for (;y;y/=2,x=x*x%mo)if (y&1) s=s*x%mo;//printf(" %lld\n",s);return s;
}
ll F(ll x,ll y){ll s=0;for (int i=1,j;i<=x;i=j+1){j=min(x/(x/i),y/(y/i));s+=(x/i)*(y/i)*(mu[j]-mu[i-1]);}//printf("F %lld %lld %lld\n",x,y,s);return s;
}
int main(){f[0]=0; f[1]=1;for (int i=2;i<N;i++)f[i]=(f[i-1]+f[i-2])%mo;f[0]=1;for (int i=1;i<N;i++)f[i]=f[i]*f[i-1]%mo;for (int i=0;i<N;i++){x=1,y=0;exgcd(f[i],mo);inv[i]=(x+mo)%mo;}mu[1]=1;for (int i=2;i<N;i++){if (!fl[i]) pri[++tot]=i,mu[i]=-1;for (int j=1;i*pri[j]<N&&j<=tot;j++){fl[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<N;i++) mu[i]+=mu[i-1];scanf("%d",&T);while (T--){scanf("%d%d",&n,&m);ans=1;if (n>m) swap(n,m);for (int i=1,j;i<=n;i=j+1){j=min(n/(n/i),m/(m/i));ans=ans*P(f[j]*inv[i-1]%mo,F(n/i,m/i))%mo;}printf("%lld\n",ans);}
}

然后就开始了愉快的O(松)优化。
1.ll转int。
2.减少除的个数。
3.用map记忆化减少搜索。
然后极端数据直接砍掉了60%的时间。

#include<map>
#include<cmath>
#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 1000005
#define mo 1000000007
using namespace std;
ll f[N],inv[N],mu[N],ans,x,y;
int fl[N],pri[N/5],T,n,m,tot,s1,s2;
map<int,ll> mp[N];
void exgcd(int a,int b){if (!b) return;exgcd(b,a%b);swap(x,y);y-=a/b*x;
}
inline ll P(ll x,ll y){ll s=1;for (;y;y/=2,x=x*x%mo)if (y&1) s=s*x%mo;return s;
}
inline ll F(int x,int y){ if (mp[x].count(y)) return mp[x][y];ll s=0;int t1,t2;for (int i=1,j;i<=x;i=j+1){t1=x/i,t2=y/i;j=min(x/t1,y/t2);if (x<=3000&&y<=3000) ++s1; else ++s2; s+=(mu[j]-mu[i-1])*t1*t2;}mp[x][y]=s;return s;
}
int main(){f[0]=0; f[1]=1;for (int i=2;i<N;i++)f[i]=(f[i-1]+f[i-2])%mo;f[0]=1;for (int i=1;i<N;i++)f[i]=f[i]*f[i-1]%mo;for (int i=0;i<N;i++){x=1,y=0;exgcd(f[i],mo);inv[i]=(x+mo)%mo;}mu[1]=1;for (int i=2;i<N;++i){if (!fl[i]) pri[++tot]=i,mu[i]=-1;for (int j=1;i*pri[j]<N&&j<=tot;++j){fl[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<N;i++) mu[i]+=mu[i-1];scanf("%d",&T);while (T--){scanf("%d%d",&n,&m);ans=1;if (n>m) swap(n,m);for (int i=1,j;i<=n;i=j+1){j=min(n/(n/i),m/(m/i));ans=ans*P(f[j]*inv[i-1]%mo,F(n/i,m/i))%mo;}printf("%lld\n",ans);}
}

bzoj4816: [Sdoi2017]数字表格相关推荐

  1. [bzoj4816][Sdoi2017]数字表格 (反演+逆元)

    (真不想做莫比乌斯了) 首先根据题意写出式子 ∏(i=1~n)∏(j=1~m)f[gcd(i,j)] 很明显的f可以预处理出来,解决 根据套路分析,我们可以先枚举gcd(i,j)==d ∏(d=1~n ...

  2. SDOI2017 数字表格

    SDOI2017 数字表格 题意: 题目传送门 题解: 答案的式子大致是这样的: \[\prod_{i = 1} ^ n \prod_{j = 1} ^ m f_{gcd(i, j)}\] 然后大力反 ...

  3. 【bzoj4816】[Sdoi2017]数字表格

    题目链接 Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Dor ...

  4. 并不对劲的bzoj4816:loj2000:p3704[SDOI2017]数字表格

    题目大意 有函数\(f(x)\),\(f(0)=0,f(1)=1,f(x)=f(x-1)+f(x-2)\) \(t\)(\(t\leq1000\))组询问,每次给定\(n,m\)(\(n,m\leq1 ...

  5. [SDOI2017]数字表格

    题目描述 Doris刚刚学习了fibonacci数列.用$f[i]$ 表示数列的第$i$ 项,那么 $f[0]=0$ ,$f[1]=1$ , $f[n]=f[n-1]+f[n-2],n\geq 2$ ...

  6. 「luogu3704」[SDOI2017]数字表格

    莫比乌斯反演,其中一些处理比较套路 1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 co ...

  7. 【BZOJ4816】数字表格,反演+枚举约数

    传送门 思路: 考场上没怎么卡常,只有60分,感觉自己宛如一个zz 先说一下60分做法 设n≤mn\leq m 随便化出来∏d=1nf(d)S(⌊nd⌋,⌊md⌋)\displaystyle\prod ...

  8. BZOJ 4816 [Sdoi2017]数字表格

    题目链接 https://lydsy.com/JudgeOnline/problem.php?id=4816 题解 反演 ∏T=1min⁡(n,m)(∏d∣Tfib(d)μ(d))⌊n/d⌋⌊m/d⌋ ...

  9. BZOJ 4816[SDOI2017]数字表格(莫比乌斯反演)

    题目链接 \(Description\) 用\(f_i\)表示\(fibonacci\)数列第\(i\)项,求\(\prod_{i=1}^{n}\prod_{j=1}^{m}f[gcd(i,j)]\) ...

  10. BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...

最新文章

  1. NTU 课程笔记:CV6422 goodness of fit
  2. 对话系统(二)-普通神经网络
  3. OpenCASCADE:使用扩展数据交换 XDE之特性
  4. MYSQL正式环境主从复制(不锁表,不停服务)
  5. web应用非法访问linux路径,Web安全对策研究.doc
  6. Anaconda使用pyinstaller打包exe程序体积过大
  7. base command
  8. VS2010的详细安装
  9. 刻录软件nero序列号有效性的检测
  10. 给定一段IP地址172.18.18.128/26,试为该网络做一个IP地址规划,要求开 发室1、开发室2以及制造部各为一个VLAN。
  11. wps excel 插入公式 整列
  12. Microsoft buildup new website for open-source project
  13. python操作gif 图片拆分
  14. 深度评测阿里云、腾讯云和华为云
  15. 水溶性CdseTe ZnS量子点
  16. Android 清理应用缓存
  17. 此windows不是正版
  18. 区块链中的女巫攻击问题
  19. 软件开发的非功能性需求
  20. 面阵相机以及相机选型公式

热门文章

  1. 503 Service Temporarily Unavailable
  2. twitteR Unauthorized
  3. 问题1038:宋小胖买切糕
  4. c语言工业设计中的案例,工业设计中CMF为什么这么重要?看看设计案例就知道了!...
  5. win7定时关机命令_只需9步教你轻松设置win7系统定时关机,无需任何工具
  6. 衣带渐宽终不悔,为伊消得人憔悴。
  7. CPP QT实现excel的冻结窗格
  8. 兜兜转转,2020已过半
  9. windows x86和x64的区别
  10. 任务管理器已被系统管理员停用的解决方法