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 ...
随机推荐
- VC++下使用ADO操作数据库
VC++下使用ADO操作数据库主要要用到 _ConnectionPtr,_CommandPtr,_RecordsetPtr三个ADO对象指针,我查找了相关资料,发现网上源码很多,但是都相对凌乱,于是自 ...
- .Net 面试题 汇总(四)
1.简述 private. protected. public. internal 修饰符的访问权限.private : 私有成员, 在类的内部才可以访问.protected : 保护成员,该类内部和 ...
- 转:iBatis简单入门教程
iBatis 简介: iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快.如果不需要太多复杂的功能,iBatis 是能够满足 ...
- 用 Core Animation 实现图片的碎片化
用 Core Animation 实现图片的碎片化 参考书籍: 效果如下: 原理其实非常简单哦:). 1. 创建一个CALayer,使用其 contents 属性来装载一张图片(获取图片的CGImag ...
- CentOS针对磁盘IO[jdb2进程]的优化
CentOS的jdb2进程总是沾满io,查了一些资料后才知道,这个问题源自系统bug,在此记录一下解决办法: 将高IO的磁盘,用以下参数remount即可 mount -t ext4 -o remou ...
- python-面向过程编程
面向过程: 核心是过程.过程指的是解决问题的步骤,设计一条流水线,机械式的思维方式. 优点:复杂的问题流程化,进而简单化
- Java基础面试题(进程和线程的区别)
进程和线程的区别 1.定义 进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更 ...
- JQuery $.axaj的基本格式
总是忘了,保存以备后用. $.ajax({ url: '', //请求的url地址 dataType: "json", //返回的格式为json async: true, //请求 ...
- 【linux】安装和配置 mysql服务器
按照官网教程,根据自己的系统安装不同的发行版 https://dev.mysql.com/doc/refman/5.6/en/linux-installation-yum-repo.html 配置: ...
- docker 不同版本 添加--insecure-registry
docker 17.0.3 vim /lib/systemd/system/docker.service 然后重启 systemctl daemon-reload , systemctl rest ...