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]数字表格的更多相关文章

  1. P3704 [SDOI2017]数字表格 (莫比乌斯反演)

    [题目链接] https://www.luogu.org/problemnew/show/P3704 [题解] https://www.luogu.org/blog/cjyyb/solution-p3 ...

  2. bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格

    洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...

  3. 洛谷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 ...

  4. 洛谷 P3704 [SDOI2017]数字表格(莫比乌斯函数)

    题面传送门 题意: 求 \[\prod\limits_{i=1}^n\prod\limits_{j=1}^mfib_{\gcd(i,j)} \] \(T\) 组测试数据,\(1 \leq T \leq ...

  5. luogu P3704 [SDOI2017]数字表格

    传送门 我是真的弱,推式子只能推一半 下面假设\(n<m\) 考虑题目要求的东西,可以考虑每个gcd的贡献,即\[\prod_{d=1}^{n}f[d]^{\sum_{i=1}^{\lfloor ...

  6. 洛咕 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]}\) ...

  7. 洛谷P3704 [SDOI2017]数字表格(莫比乌斯反演)

    传送门 yyb大佬太强啦…… 感觉还是有一点地方没有搞懂orz //minamoto #include<cstdio> #include<iostream> #include& ...

  8. 并不对劲的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 ...

  9. 洛谷 P3704 SDOI2017 数字表格

    题意: 给定两个整数 \(n, m\),求: \[\prod_{i = 1} ^ n \prod_{j = 1} ^ m \operatorname{Fib}_{\gcd\left(n, m\righ ...

随机推荐

  1. Centos7+Mysql80安装+远程链接开启

    CentOS7安装mysql80 下载repo源 在xshell运行命令 # wget http://repo.mysql.com/mysql80-community-release-el7.rpm ...

  2. right here waiting的歌词

    right here waiting的歌词 2006-12-30 17:36 匿名 | 分类:音乐 | 该问题已经合并到>> right here waiting的歌词有吗?   扫描二维 ...

  3. 新手指南:Linux上vi(vim)编辑器使用教程

    vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim).vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率.vi是“visual interface”的缩 ...

  4. javascript库概念与连缀

    一.JavaScript 库 1.什么是javascript库: javascript库,说白了,就是把各种常用的代码片段,组织起来放在一个 js 文件里,组成一个包,这个包就是 JavaScript ...

  5. 2017-2018-2 20165318 实验二《Java面向对象程序设计》实验报告

    2017-2018-2 20165318 实验二<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计        班级:1653班        姓名:孙晓暄  ...

  6. 20165318 2017-2018-2 《Java程序设计》第三周学习总结

    20165318 2017-2018-2 <Java程序设计>第三周学习总结 学习总结 我感觉从这一章开始,新的知识点扑面而来,很多定义都是之前没有接触过的,看书的时候难免有些晦涩.但由于 ...

  7. [SHOI2012]回家的路

    题目背景 SHOI2012 D2T1 题目描述 2046 年 OI 城的城市轨道交通建设终于全部竣工,由于前期规划周密,建成后的轨道交通网络由2n2n条地铁线路构成,组成了一个nn纵nn横的交通网.如 ...

  8. 最长公共子序列&最长公共子串

    首先区别最长公共子串和最长公共子序列  LCS(计算机科学算法:最长公共子序列)_百度百科 最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 最长公共子序列: http ...

  9. mongodb的学习-1-NoSQL

    菜鸟教程的学习笔记-http://www.runoob.com/mongodb/nosql.html 关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有 ...

  10. mongodb的学习-3-在Mac上的安装配置

    1.使用homebrew安装: brew install mongodb 查看安装好的版本: mongo --version MongoDB shell version v3.6.4 git vers ...