BZOJ4816 数字表格
4816: [Sdoi2017]数字表格
Time Limit: 50 Sec Memory Limit: 128 MB
Description
Input
有多组测试数据。
Output
Sample Input
2 3
4 5
6 7
Sample Output
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 数字表格相关推荐
- BZOJ 2154 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演,经典好题)(Luogu P1829)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P1829 [国家集训队]Crash的数字表格 / JZPTAB(反演,经典好题) Problem S ...
- bzoj2154 Crash的数字表格
2154: Crash的数字表格 Time Limit: 20 Sec Memory Limit: 259 MB Submit: 4549 Solved: 1643 [Submit][Status ...
- bzoj2154: Crash的数字表格
好神的莫比乌斯函数然后O(sqrt(n)*sqrt(n))好神的优化啊. #include<cstdio> #include<cstring> #include<ccty ...
- 【BZOJ】【2154】Crash的数字表格
莫比乌斯反演 PoPoQQQ讲义第4题 题解:http://www.cnblogs.com/jianglangcaijin/archive/2013/11/27/3446169.html 感觉两次sq ...
- BZOJ 2154 Crash的数字表格 (莫比乌斯反演)
Crash的数字表格 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如, ...
- P1829 [国家集训队]Crash的数字表格(推了好久的mobius反演)
P1829 [国家集训队]Crash的数字表格 / JZPTAB 推导过程 ∑i=1n∑j=1mlcm(i,j)\sum_{i = 1} ^{n} \sum_{j = 1} ^{m} lcm(i, j ...
- 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 ...
- 获得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 ...
- 【BZOJ2154】Crash的数字表格 [莫比乌斯反演]
Crash的数字表格 Time Limit: 20 Sec Memory Limit: 259 MB [Submit][Status][Discuss] Description 今天的数学课上,Cr ...
- SDOI2017 数字表格
SDOI2017 数字表格 题意: 题目传送门 题解: 答案的式子大致是这样的: \[\prod_{i = 1} ^ n \prod_{j = 1} ^ m f_{gcd(i, j)}\] 然后大力反 ...
最新文章
- APPLE:疑问驱动下的学习与实践
- 全flash站制作剖析
- it oracle 培训,Oracle数据库技术培训_OracleDBA数据库工程师_Oracle数据库在线学习视频教程_IT职业培训-51CTO学院_精培学院...
- 在Myeclipse中没有部署jeesite项目,但是每次运行其他项目时,还是会加载jeesite项目...
- 如何用两个开关控制同一盏灯
- [保存]C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
- 你对NLP的迁移学习爱的有多深?21个问题弄懂最新的NLP进展。
- 电力拖动计算机控制系统讲什么,电力拖动控制系统 [黄松清 编著] 2015年版
- stata学习笔记|自相关处理问题
- Python实现截图AI文字识字小工具
- 米家扫地机器人 设置不停止_【小米 米家 扫地机器人使用总结】设置|清扫_摘要频道_什么值得买...
- 看完这一篇,智能家居的坑你至少避开80%(上)
- 2021-7-28-自动化运维Ansible
- VMware Workstation Pro 虚拟机搭建
- r5 5600x性能 r5 5600x有核显吗
- 10大主流压力测试工具
- 叶飘落,诉说着冷寂与孤独
- 自学python有什么建议,想通过自学Python,朋友们有哪些提议吗?
- 大型SEO策略方法(转载)
- 赛门铁克:软件是灵魂