4816: [Sdoi2017]数字表格

Time Limit: 50 Sec  Memory Limit: 128 MB

Description

Doris刚刚学习了fibonacci数列。用f[i]表示数列的第i项,那么
f[0]=0
f[1]=1
f[n]=f[n-1]+f[n-2],n>=2
Doris用老师的超级计算机生成了一个n×m的表格,第i行第j列的格子中的数是f[gcd(i,j)],其中gcd(i,j)表示i,j的最大公约数。Doris的表格中共有n×m个数,她想知道这些数的乘积是多少。答案对10^9+7取模。

Input

有多组测试数据。

第一个一个数T,表示数据组数。
接下来T行,每行两个数n,m
T<=1000,1<=n,m<=10^6

Output

输出T行,第i行的数是第i组数据的结果

Sample Input

3
2 3
4 5
6 7

Sample Output

1
6
960


题解

这道题很好地延续了SDOI的优良传统,考了一道莫比乌斯反演以供娱乐。

由于我们一眼发现了这是一道莫比乌斯反演水题,正如做所有的莫比乌斯反演一样,我们把要求的式子先写出来并推导

\begin{eqnarray*}
ans & = & \prod_{i}^{n}\prod _{j}^{m}f( \gcd(i,j) ) \\
& = & \prod_{k}^{n}f(k) ^ {\sum_{i}^{\frac{n}{k}}\sum_{j}^{\frac{m}{k}}[\gcd(i,j)=1]} \\
& = & \prod_{k}^{n}f(k) ^ {\sum_{i}^{\frac{n}{k}}\sum_{j}^{\frac{m}{k}}\sum_{x\mid{i}\&x\mid{j}}~~\mu(x)} \\
& = & \prod_{k}^{n}\prod_{x}^{\frac{n}{k}}(f(k) ^ {\mu(x)})^{\frac{n}{kx}\frac{m}{kx}}
\end{eqnarray*}

为了能够把\(f(k) ^ {\mu(x)}\)提出来,显然,我们可以设\(T=kx\),\(g(T)=\prod_{k\mid{T}}f(k) ^ {\mu(\frac{T}{k})}\)

化简得到\(ans = \prod_{T}^{n}g(T)^{\frac{n}{T}\frac{m}{T}}\)

求出$f$以及$f$的逆元,线性筛求$\mu$,Dirichlet卷积求出$g$,然后计算$g$的前缀积$g'$以及$g'$的逆元

查询使用大众喜闻乐见的分块,至此,我们切掉了这道水题。

代码

#include<bits/stdc++.h>
using namespace std;
template <class _T> inline void read(_T &_x) {int _t; bool flag = false;while ((_t = getchar()) != '-' && (_t < '0' || _t > '9')) ;if (_t == '-') _t = getchar(), flag = true; _x = _t - '0';while ((_t = getchar()) >= '0' && _t <= '9') _x = _x * 10 + _t - '0';if (flag) _x = -_x;
}
typedef long long LL;
const int maxn = 1000010;
const int mod = 1000000007;
int f[maxn], f_re[maxn], mu[maxn], g[maxn], g_re[maxn];
bool vis[maxn]; int prime[maxn / 10], pcnt;
#define trans(x) ((int)((LL)x % mod))
#define reg register
inline void update(int &a, reg int b) {a = trans(a * b);if (a < 0) a += mod;
}
inline int qpower(int a, reg LL b) {int ret = 1;while (b) {if (b & 1) update(ret, a);update(a, a), b >>= 1;}return ret;
}
inline int calc(reg int a, reg int b) {if (b == 0) return 1;return b < 0 ? f_re[a] : f[a];
}
void init() {f[0] = 0, f[1] = f_re[1] = g[1] = mu[1] = 1;reg int i, j;for (i = 2; i < maxn; ++i) {f[i] = f[i - 1] + f[i - 2];if (f[i] >= mod) f[i] -= mod;f_re[i] = qpower(f[i], mod - 2);}for (i = 2; i < maxn; ++i) {g[i] = 1;if (!vis[i]) {prime[++pcnt] = i;mu[i] = -1;}for (j = 1; j <= pcnt && prime[j] * i < maxn; ++j) {vis[i * prime[j]] = true;if (i % prime[j] == 0) {mu[i * prime[j]] = 0;break;}mu[i * prime[j]] = -mu[i];}}for (i = 1; i * i < maxn; ++i) {update(g[i * i], calc(i, mu[i]));for (j = i + 1; i * j < maxn; ++j)update(g[i * j], trans(calc(i, mu[j]) * calc(j, mu[i])));}g[0] = g_re[0] = 1;for (i = 1; i < maxn; ++i) {update(g[i], g[i - 1]);g_re[i] = qpower(g[i], mod - 2);}
}
inline int query(reg int a, reg int b) {if (a > b) {int t = a; a = b, b = t; }int ret = 1;for (reg int i = 1, j, x, y; i <= a; i = j + 1) {x = a / i, y = b / i;j = min(a / x, b / y);update(ret, qpower(trans(g[j] * g_re[i - 1]), (LL)x * y));}return ret;
}
int main() {//freopen(".in", "r", stdin);//freopen(".out", "w", stdout);
    init();int T, a, b; read(T);while (T--) {read(a), read(b);printf("%d\n", query(a, b));}return 0;
}

View Code

转载于:https://www.cnblogs.com/akhpl/p/6730864.html

BZOJ4816 数字表格相关推荐

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

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

  2. bzoj2154 Crash的数字表格

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 4549  Solved: 1643 [Submit][Status ...

  3. bzoj2154: Crash的数字表格

    好神的莫比乌斯函数然后O(sqrt(n)*sqrt(n))好神的优化啊. #include<cstdio> #include<cstring> #include<ccty ...

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

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

  5. BZOJ 2154 Crash的数字表格 (莫比乌斯反演)

    Crash的数字表格 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如, ...

  6. P1829 [国家集训队]Crash的数字表格(推了好久的mobius反演)

    P1829 [国家集训队]Crash的数字表格 / JZPTAB 推导过程 ∑i=1n∑j=1mlcm(i,j)\sum_{i = 1} ^{n} \sum_{j = 1} ^{m} lcm(i, j ...

  7. P1829 [国家集训队]Crash的数字表格 / JZPTAB

    P1829 [国家集训队]Crash的数字表格 / JZPTAB 题意: 求∑i=1n∑j=1mlcm(i,j)\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)∑i=1n​∑j ...

  8. 获得N^2个往返接力数字表格的算法

    在描述算法之前,先看看下面的5*5的表格:  1  3  4  10  11  2  5  9  12   19   6  8  13  18  20  7  14  17  21  24  15   ...

  9. 【BZOJ2154】Crash的数字表格 [莫比乌斯反演]

    Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MB [Submit][Status][Discuss] Description 今天的数学课上,Cr ...

  10. SDOI2017 数字表格

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

最新文章

  1. APPLE:疑问驱动下的学习与实践
  2. 全flash站制作剖析
  3. it oracle 培训,Oracle数据库技术培训_OracleDBA数据库工程师_Oracle数据库在线学习视频教程_IT职业培训-51CTO学院_精培学院...
  4. 在Myeclipse中没有部署jeesite项目,但是每次运行其他项目时,还是会加载jeesite项目...
  5. 如何用两个开关控制同一盏灯
  6. [保存]C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
  7. 你对NLP的迁移学习爱的有多深?21个问题弄懂最新的NLP进展。
  8. 电力拖动计算机控制系统讲什么,电力拖动控制系统 [黄松清 编著] 2015年版
  9. stata学习笔记|自相关处理问题
  10. Python实现截图AI文字识字小工具
  11. 米家扫地机器人 设置不停止_【小米 米家 扫地机器人使用总结】设置|清扫_摘要频道_什么值得买...
  12. 看完这一篇,智能家居的坑你至少避开80%(上)
  13. 2021-7-28-自动化运维Ansible
  14. VMware Workstation Pro 虚拟机搭建
  15. r5 5600x性能 r5 5600x有核显吗
  16. 10大主流压力测试工具
  17. 叶飘落,诉说着冷寂与孤独
  18. 自学python有什么建议,想通过自学Python,朋友们有哪些提议吗?
  19. 大型SEO策略方法(转载)
  20. 赛门铁克:软件是灵魂

热门文章

  1. DeepFool论文解读
  2. 我的八年硕博士生涯——CMU王赟写在入职Facebook之前
  3. excel文档中了宏病毒--
  4. 程序员如何缓解眼睛疲劳酸痛症状?
  5. 与你,预约一个来生的相逢
  6. “被授权”泛滥 个人信息保护怎么管?
  7. 切换IE浏览器的版本
  8. 【转】奇幻RPG(人物构造 与 Abstract Factory模式)
  9. 移动硬盘变为raw格式时,如何进行数据恢复
  10. windows下安装maven后运行:mvn help:system报错