P3704 [SDOI2017]数字表格
P3704 [SDOI2017]数字表格
分析:
$\ \ \ \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} f[gcd(i, j)]$
$=\prod\limits_{d = 1}^{min(n, m)} \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} [gcd(i, j) = d] \times f[d]$
$=\prod\limits_{d = 1}^{min(n, m)} f[d] ^ {\sum\limits_{i = 1}^{n} \sum\limits_{j = 1}^{m} [gcd(i, j) = d]}$
$=\prod\limits_{d = 1}^{min(n, m)} f[d] ^ {\sum\limits_{k = 1}^{min( \frac{n}{d} , \frac{m}{d} )} \mu(k) \frac{n}{kd} \frac{m}{kd}}$
设$T=kd$
$\prod\limits_{T = 1} ^ {min(n, m)} (\prod\limits_{d | T} f[d] ^ {\mu(\frac{T}{d}) } ) ^ {\frac{n}{T} \frac{m}{T} }$
对中间的部分$nlogn$预处理,$O(\sqrt n)$处理每个询问。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = , mod = 1e9 + ;
int mu[N], pri[N], f[N], g1[N], g2[N], inv1[N], inv2[N];
bool nopri[N]; int ksm(int a,LL b) {
register int res = ;
while (b) {
if (b & ) res = 1ll * res * a % mod;
a = 1ll * a * a % mod;
b >>= ;
}
return res % mod;
}
void init(int n) {
nopri[] = true; mu[] = ;
int tot = ;
for (int i = ; i <= n; ++i) {
if (!nopri[i]) pri[++tot] = i, mu[i] = -;
for (register int j = ; j <= tot && pri[j] * i <= n; ++j) {
nopri[pri[j] * i] = ;
if (i % pri[j] == ) { mu[i * pri[j]] = ; break; }
mu[pri[j] * i] = -mu[i];
}
}
f[] = , f[] = ; g1[] = g2[] = ;
for (register int i = ; i <= n; ++i) f[i] = (f[i - ] + f[i - ]) % mod, g1[i] = g2[i] = ;
for (int i = ; i <= n; ++i)
for (int j = i; j <= n; j += i) {
if (mu[j / i] == ) continue;
else if (mu[j / i] == ) g1[j] = 1ll * g1[j] * f[i] % mod;
else g2[j] = 1ll * g2[j] * f[i] % mod;
}
g1[] = g2[] = inv1[] = inv2[] = ;
for (int i = ; i <= n; ++i) {
g1[i] = 1ll * g1[i] * g1[i - ] % mod,
g2[i] = 1ll * g2[i] * g2[i - ] % mod;
inv1[i] = ksm(g1[i], mod - );
inv2[i] = ksm(g2[i], mod - );
}
}
void solve() {
int n = read(), m = read(), nm = min(n, m), pos = , ans = ;
for (int t1, t2, i = ; i <= nm; i = pos + ) {
pos = min(n / (n / i), m / (m / i));
LL t = 1ll * (n / i) * (m / i); // !!!
t1 = 1ll * g1[pos] * inv1[i - ] % mod;
t2 = 1ll * g2[pos] * inv2[i - ] % mod;
ans = 1ll * ans * ksm(t1, t) % mod * ksm(ksm(t2, t), mod - ) % mod;
}
cout << ans << "\n";
}
int main() {
init();
for (int T = read(); T --; solve());
return ;
}
P3704 [SDOI2017]数字表格的更多相关文章
- P3704 [SDOI2017]数字表格 (莫比乌斯反演)
[题目链接] https://www.luogu.org/problemnew/show/P3704 [题解] https://www.luogu.org/blog/cjyyb/solution-p3 ...
- bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格
洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...
- 洛谷P3704 [SDOI2017]数字表格
题目描述 Doris刚刚学习了fibonacci数列.用f[i]f[i] 表示数列的第ii 项,那么 f[0]=0f[0]=0 ,f[1]=1f[1]=1 , f[n]=f[n-1]+f[n-2],n ...
- 洛谷 P3704 [SDOI2017]数字表格(莫比乌斯函数)
题面传送门 题意: 求 \[\prod\limits_{i=1}^n\prod\limits_{j=1}^mfib_{\gcd(i,j)} \] \(T\) 组测试数据,\(1 \leq T \leq ...
- luogu P3704 [SDOI2017]数字表格
传送门 我是真的弱,推式子只能推一半 下面假设\(n<m\) 考虑题目要求的东西,可以考虑每个gcd的贡献,即\[\prod_{d=1}^{n}f[d]^{\sum_{i=1}^{\lfloor ...
- 洛咕 P3704 [SDOI2017]数字表格
大力推式子 现根据套路枚举\(\gcd(i,j)\) \(ans=\Pi_{x=1}^nfib[x]^{\sum_{i=1}^{n/x}\sum_{j=1}^{n/x}[\gcd(i,j)=1]}\) ...
- 洛谷P3704 [SDOI2017]数字表格(莫比乌斯反演)
传送门 yyb大佬太强啦…… 感觉还是有一点地方没有搞懂orz //minamoto #include<cstdio> #include<iostream> #include& ...
- 并不对劲的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 ...
- 洛谷 P3704 SDOI2017 数字表格
题意: 给定两个整数 \(n, m\),求: \[\prod_{i = 1} ^ n \prod_{j = 1} ^ m \operatorname{Fib}_{\gcd\left(n, m\righ ...
随机推荐
- Centos7+Mysql80安装+远程链接开启
CentOS7安装mysql80 下载repo源 在xshell运行命令 # wget http://repo.mysql.com/mysql80-community-release-el7.rpm ...
- right here waiting的歌词
right here waiting的歌词 2006-12-30 17:36 匿名 | 分类:音乐 | 该问题已经合并到>> right here waiting的歌词有吗? 扫描二维 ...
- 新手指南:Linux上vi(vim)编辑器使用教程
vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim).vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率.vi是“visual interface”的缩 ...
- javascript库概念与连缀
一.JavaScript 库 1.什么是javascript库: javascript库,说白了,就是把各种常用的代码片段,组织起来放在一个 js 文件里,组成一个包,这个包就是 JavaScript ...
- 2017-2018-2 20165318 实验二《Java面向对象程序设计》实验报告
2017-2018-2 20165318 实验二<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:孙晓暄 ...
- 20165318 2017-2018-2 《Java程序设计》第三周学习总结
20165318 2017-2018-2 <Java程序设计>第三周学习总结 学习总结 我感觉从这一章开始,新的知识点扑面而来,很多定义都是之前没有接触过的,看书的时候难免有些晦涩.但由于 ...
- [SHOI2012]回家的路
题目背景 SHOI2012 D2T1 题目描述 2046 年 OI 城的城市轨道交通建设终于全部竣工,由于前期规划周密,建成后的轨道交通网络由2n2n条地铁线路构成,组成了一个nn纵nn横的交通网.如 ...
- 最长公共子序列&最长公共子串
首先区别最长公共子串和最长公共子序列 LCS(计算机科学算法:最长公共子序列)_百度百科 最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 最长公共子序列: http ...
- mongodb的学习-1-NoSQL
菜鸟教程的学习笔记-http://www.runoob.com/mongodb/nosql.html 关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有 ...
- mongodb的学习-3-在Mac上的安装配置
1.使用homebrew安装: brew install mongodb 查看安装好的版本: mongo --version MongoDB shell version v3.6.4 git vers ...