[Luogu P3704] [BZOJ 4816] [SDOI2017]数字表格
洛谷传送门
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∏nj=1∏mF[gcd(i,j)]=d=1∏nF[d]∑i=1n∑j=1m[gcd(i,j)=d]=d=1∏nF[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∏nF[d]∑p=1⌊dn⌋μ(p)⌊dpn⌋⌊dpm⌋=T=1∏nd∣T∏F[d]μ(dT)⌊Tn⌋⌊Tm⌋=T=1∏nd∣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(TNlog(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]数字表格相关推荐
- BZOJ 4816 [Sdoi2017]数字表格
题目链接 https://lydsy.com/JudgeOnline/problem.php?id=4816 题解 反演 ∏T=1min(n,m)(∏d∣Tfib(d)μ(d))⌊n/d⌋⌊m/d⌋ ...
- BZOJ 4816[SDOI2017]数字表格(莫比乌斯反演)
题目链接 \(Description\) 用\(f_i\)表示\(fibonacci\)数列第\(i\)项,求\(\prod_{i=1}^{n}\prod_{j=1}^{m}f[gcd(i,j)]\) ...
- SDOI2017 数字表格
SDOI2017 数字表格 题意: 题目传送门 题解: 答案的式子大致是这样的: \[\prod_{i = 1} ^ n \prod_{j = 1} ^ m f_{gcd(i, j)}\] 然后大力反 ...
- 并不对劲的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 ...
- [SDOI2017]数字表格
题目描述 Doris刚刚学习了fibonacci数列.用$f[i]$ 表示数列的第$i$ 项,那么 $f[0]=0$ ,$f[1]=1$ , $f[n]=f[n-1]+f[n-2],n\geq 2$ ...
- 【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 ...
- 「luogu3704」[SDOI2017]数字表格
莫比乌斯反演,其中一些处理比较套路 1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 co ...
- [bzoj4816][Sdoi2017]数字表格 (反演+逆元)
(真不想做莫比乌斯了) 首先根据题意写出式子 ∏(i=1~n)∏(j=1~m)f[gcd(i,j)] 很明显的f可以预处理出来,解决 根据套路分析,我们可以先枚举gcd(i,j)==d ∏(d=1~n ...
- BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...
- 【BZOJ】【2154】Crash的数字表格
莫比乌斯反演 PoPoQQQ讲义第4题 题解:http://www.cnblogs.com/jianglangcaijin/archive/2013/11/27/3446169.html 感觉两次sq ...
最新文章
- 智源沙龙:人工智能的技术发展与投资
- 解决git push 中remote: Permission to xxxxx.git denied to xxx. fatal: unable to access xxxx 403(转)
- nodejs redis 过期时间_别在为Redis面试而烦恼了?看完暴答【面试管】
- 非阻塞I/O多路复用机制
- java加载配置文件
- 主板没有rgb接口怎么接灯_性价比稳定的RGB水冷散热器:乔思伯天使眼TW2-240测评...
- [AppScan深入浅出]修复漏洞:会话标识未更新
- 台达ASDA-A2速度模式调试方法
- php微博自动评论,新浪微博自动评论工具
- PPT模板下载网站推荐
- 以下不正确的C语言标识符是( ),以下不正确的C语言标识符是 _____。
- ctfshow web入门 SSTI
- 路由器和交换机用什么线连接?
- html中的列表、表格、表单
- 技术分享 | 使用 Zabbix + Grafana 搭建服务器监控系统
- 什么是自然语言处理,自然语言处理目前的应用有哪些?
- 往事如烟 - 高手老胡
- 工作总结PPT怎么写?60套工作总结PPT模板:年度汇报、项目汇报,晋升述职
- C#毕业设计——基于C#+asp.net+cs的Web Mail邮件收发系统设计与实现(毕业论文+程序源码)——邮件收发系统
- iPhone 13 支持卫星上网?没那么简单