洛谷传送门

BZOJ传送门

题目描述

Doris刚刚学习了fibonacci数列。用f[i]f[i]f[i]表示数列的第iii项,那么

f[0]=0,f[1]=1f[0]=0,f[1]=1f[0]=0,f[1]=1,

f[n]=f[n−1]+f[n−2],n≥2f[n]=f[n-1]+f[n-2],n\geq 2f[n]=f[n−1]+f[n−2],n≥2

Doris用老师的超级计算机生成了一个n×mn×mn×m的表格,

第iii行第jjj列的格子中的数是f[gcd⁡(i,j)]f[\gcd(i,j)]f[gcd(i,j)],其中gcd⁡(i,j)\gcd(i,j)gcd(i,j)表示i,ji,ji,j的最大公约数。

Doris的表格中共有n×mn×mn×m个数,她想知道这些数的乘积是多少。

答案对109+710^9+7109+7取模。

输入输出格式

输入格式:

有多组测试数据。

第一个一个数TTT,表示数据组数。

接下来TTT行,每行两个数n,mn,mn,m

输出格式:

输出TTT行,第iii行的数是第iii组数据的结果

输入输出样例

输入样例#1:

3
2 3
4 5
6 7

输出样例#1:

1
6
960

说明

对10%10\%10%的数据,1≤n,m≤1001\leq n,m\leq 1001≤n,m≤100

对30%30\%30%的数据,1≤n,m1\leq n,m1≤n,m

另外存在30%30\%30%的数据,T≤3T\leq 3T≤3

对100%100\%100%的数据,T≤1000,1≤n,m≤106T\leq1000,1\leq n,m\leq 10^6T≤1000,1≤n,m≤106

解题分析

∏i=1n∏j=1mF[gcd(i,j)]=∏d=1nF[d]∑i=1n∑j=1m[gcd(i,j)=d]=∏d=1nF[d]∑p=1⌊nd⌋μ(p)⌊ndp⌋⌊mdp⌋\prod_{i=1}^{n}\prod_{j=1}^mF[gcd(i,j)] \\ =\prod_{d=1}^{n}F[d]^{\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=d]} \\ =\prod_{d=1}^{n}F[d]^{\sum_{p=1}^{\lfloor\frac{n}{d}\rfloor}\mu(p)\lfloor\frac{n}{dp}\rfloor\lfloor\frac{m}{dp}\rfloor} i=1∏n​j=1∏m​F[gcd(i,j)]=d=1∏n​F[d]∑i=1n​∑j=1m​[gcd(i,j)=d]=d=1∏n​F[d]∑p=1⌊dn​⌋​μ(p)⌊dpn​⌋⌊dpm​⌋

套路地设T=dpT=dpT=dp
∏d=1nF[d]∑p=1⌊nd⌋μ(p)⌊ndp⌋⌊mdp⌋=∏T=1n∏d∣TF[d]μ(Td)⌊nT⌋⌊mT⌋=∏T=1n∏d∣T(F[d]μ(Td))⌊nT⌋⌊mT⌋\prod_{d=1}^{n}F[d]^{\sum_{p=1}^{\lfloor\frac{n}{d}\rfloor}\mu(p)\lfloor\frac{n}{dp}\rfloor\lfloor\frac{m}{dp}\rfloor} \\ =\prod_{T=1}^{n}\prod_{d|T}F[d]^{\mu(\frac{T}{d})\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor} \\ =\prod_{T=1}^{n}\prod_{d|T}(F[d]^{\mu(\frac{T}{d})})^{\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor} d=1∏n​F[d]∑p=1⌊dn​⌋​μ(p)⌊dpn​⌋⌊dpm​⌋=T=1∏n​d∣T∏​F[d]μ(dT​)⌊Tn​⌋⌊Tm​⌋=T=1∏n​d∣T∏​(F[d]μ(dT​))⌊Tn​⌋⌊Tm​⌋
然后就可以筛出μ(i)\mu(i)μ(i)后O(Nln(N))O(Nln(N))O(Nln(N))预处理, O(TNlog(N))O(T\sqrt N log(N))O(TN​log(N))回答询问了。

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <algorithm>
#define R register
#define IN inline
#define W while
#define gc getchar()
#define MOD 1000000007ll
#define ll long long
#define MX 1000500
template <class T>
IN void in(T &x)
{x = 0; R char c = gc;for (; !isdigit(c); c = gc);for (;  isdigit(c); c = gc)x = (x << 1) + (x << 3) + c - 48;
}
template <class T> IN T max(T a, T b) {return a > b ? a : b;}
template <class T> IN T min(T a, T b) {return a < b ? a : b;}
IN void add(R int ad, int &tar) {tar += ad; if (tar > MOD) tar -= MOD;}
int pcnt;
int miu[MX], pri[MX];
ll sum[MX], F[MX], inv[MX];
bool npr[MX];
IN ll fpow(R ll base, R ll tim)
{ll ret = 1;W (tim){if (tim & 1) ret = ret * base % MOD;base = base * base % MOD, tim >>= 1;}return ret;
}
void get()
{miu[1] = 1; R int tar;for (R int i = 2; i <= 1e6; ++i){if (!npr[i]) pri[++pcnt] = i, miu[i] = -1;for (R int j = 1; j <= pcnt; ++j){tar = i * pri[j];if (tar > 1e6) break;npr[tar] = true;if (!(i % pri[j])) {miu[tar] = 0; break;}miu[tar] = -miu[i];}}sum[0] = F[1] = 1;for (R int i = 2; i <= 1e6; ++i) F[i] = (F[i - 1] + F[i - 2]) % MOD;for (R int i = 1; i <= 1e6; ++i) inv[i] = fpow(F[i], MOD - 2), sum[i] = 1;for (R int i = 1; i <= 1e6; ++i)for (R int j = 1, tar; (tar = j * i) <= 1e6; ++j){if (miu[j] == 1) sum[tar] = sum[tar] * F[i] % MOD;else if (miu[j] == -1) sum[tar] = sum[tar] * inv[i] % MOD;}for (R int i = 2; i <= 1e6; ++i) sum[i] = sum[i - 1] * sum[i] % MOD;
}
int main(void)
{ll ans;int T, n, m; in(T); get();W (T--){in(n), in(m); ans = 1;if (n > m) std::swap(n, m);for (R int lef = 1, rig; lef <= n; lef = rig + 1){rig = std::min(n / (n / lef), m / (m / lef));ans = ans * fpow(sum[rig] * fpow(sum[lef - 1], MOD - 2) % MOD, 1ll * (n / lef) * (m / lef)) % MOD;}printf("%lld\n", ans);}
}

[Luogu P3704] [BZOJ 4816] [SDOI2017]数字表格相关推荐

  1. BZOJ 4816 [Sdoi2017]数字表格

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

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

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

  3. SDOI2017 数字表格

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

  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. 【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 ...

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

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

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

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

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

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

  10. 【BZOJ】【2154】Crash的数字表格

    莫比乌斯反演 PoPoQQQ讲义第4题 题解:http://www.cnblogs.com/jianglangcaijin/archive/2013/11/27/3446169.html 感觉两次sq ...

最新文章

  1. 智源沙龙:人工智能的技术发展与投资
  2. 解决git push 中remote: Permission to xxxxx.git denied to xxx. fatal: unable to access xxxx 403(转)
  3. nodejs redis 过期时间_别在为Redis面试而烦恼了?看完暴答【面试管】
  4. 非阻塞I/O多路复用机制
  5. java加载配置文件
  6. 主板没有rgb接口怎么接灯_性价比稳定的RGB水冷散热器:乔思伯天使眼TW2-240测评...
  7. [AppScan深入浅出]修复漏洞:会话标识未更新
  8. 台达ASDA-A2速度模式调试方法
  9. php微博自动评论,新浪微博自动评论工具
  10. PPT模板下载网站推荐
  11. 以下不正确的C语言标识符是( ),以下不正确的C语言标识符是 _____。
  12. ctfshow web入门 SSTI
  13. 路由器和交换机用什么线连接?
  14. html中的列表、表格、表单
  15. 技术分享 | 使用 Zabbix + Grafana 搭建服务器监控系统
  16. 什么是自然语言处理,自然语言处理目前的应用有哪些?
  17. 往事如烟 - 高手老胡
  18. 工作总结PPT怎么写?60套工作总结PPT模板:年度汇报、项目汇报,晋升述职
  19. C#毕业设计——基于C#+asp.net+cs的Web Mail邮件收发系统设计与实现(毕业论文+程序源码)——邮件收发系统
  20. iPhone 13 支持卫星上网?没那么简单

热门文章

  1. 夜深了,最好喝点咖啡
  2. 网站访问统计术语和度量方法
  3. tomcat宕机解决方法
  4. java is alphabetic_\p{IsAlphabetic}
  5. 【LWIP】(补充)STM32H743(M7内核)CubeMX配置LWIP并ping通
  6. 怎么看xp计算机mac地址,查找MAC地址的两种方法
  7. 格式化的硬盘能恢复吗 硬盘格式化以后能恢复吗
  8. Nginx的rewrite(地址重定向)剖析
  9. 2012年8月21日
  10. python练习54:取一个整数a从右端开始的4〜7位