[BZOJ4816]数字表格
来源:互联网 发布:js如何给radio赋值 编辑:程序博客网 时间:2024/05/18 02:02
题目链接:BZOJ4816
题目大意
求
分析
1. 枚举gcd,转化为求
2. 而求
3. 设
4. 设
5. 那么如何求
6. 然而因为模数过大,不能
7. 总结:预处理筛出
上代码
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef long long LL;const int N = 1e6 + 10;const int MOD = 1e9 + 7;int n, m;inline int read() { register char ch = getchar(); register int ans = 0, neg = 1; for (; !isdigit(ch); ch = getchar()) if (ch == '-') neg = -1; for (; isdigit(ch); ch = getchar()) ans = ans * 10 + ch - '0'; return ans * neg;}inline int pls(int a, int b) { LL ans = (LL)a + b; return ans >= (LL)MOD ? ans - MOD : ans;}inline int mul(int a, int b) { return (LL)a * b % MOD;}inline int power(int a, int b) { int ans = 1; while (b) { if (b & 1) ans = mul(ans, a); b >>= 1, a = mul(a, a); } return ans;}bool notPrime[N];int prime[N], mu[N];int fi[N], pf[N], invfi[N], invpf[N];int gi[N], pg[N], invpg[N];void preCalc(int a) { int cnt = 0, mut = 1; mu[1] = 1, fi[0] = 0, fi[1] = pf[1] = 1; for (int i = 2; i <= a; ++i) { if (!notPrime[i]) prime[++cnt] = i, mu[i] = -1; for (int j = 1, k; j <= cnt && (k = i * prime[j]) <= a; ++j) { notPrime[k] = true; if (i % prime[j] == 0) { mu[k] = 0; break; } mu[k] = -mu[i]; } pf[i] = mul(pf[i - 1], fi[i] = pls(fi[i - 1], fi[i - 2])); } invpf[a] = power(pf[a], MOD - 2); for (int i = a; i >= 1; --i) { gi[i] = 1; invpf[i - 1] = mul(invpf[i], fi[i]); invfi[i] = mul(pf[i - 1], invpf[i]); } for (int i = 2; i <= a; ++i) for (int j = 1, k; (k = i * j) <= a; ++j) if (mu[j] == 1) gi[k] = mul(gi[k], fi[i]); else if (mu[j] == -1) gi[k] = mul(gi[k], invfi[i]); pg[1] = 1; for (int i = 2; i <= a; ++i) pg[i] = mul(pg[i - 1], gi[i]); invpg[a] = power(pg[a], MOD - 2); for (int i = a; i >= 1; --i) invpg[i - 1] = mul(invpg[i], gi[i]);}int main() { int T = read(); preCalc(1e6); while (T--) { n = read(), m = read(); if (n > m) swap(n, m); int ans = 1; for (int i = 1, nxt; i <= n; i = ++nxt) { nxt = min(n / (n / i), m / (m / i)); ans = mul(ans, power(mul(pg[nxt], invpg[i - 1]), (LL)(n / i) * (m / i) % (MOD - 1))); } printf("%d\n", ans); } return 0;}
以上
- BZOJ4816 [Sdoi2017]数字表格
- bzoj4816: [Sdoi2017]数字表格
- [BZOJ4816]数字表格
- 【bzoj4816】[Sdoi2017]数字表格
- [bzoj4816][SDOI2017]数字表格
- bzoj4816: [Sdoi2017]数字表格
- BZOJ4816: [Sdoi2017]数字表格
- [BZOJ4816][Sdoi2017]数字表格 数学
- 【BZOJ4816】数字表格,反演+枚举约数
- [数论 反演]BZOJ4816 [Sdoi2017]数字表格
- [莫比乌斯反演] BZOJ4816: [Sdoi2017]数字表格
- [BZOJ4816][SDOI2017]数字表格(莫比乌斯反演)
- excel表格中的数字
- 4816: [Sdoi2017]数字表格
- 【SDOI2017】数字表格
- 【SDOI2017】数字表格
- 山东OI2017-数字表格
- 数字9X9的表格
- 使用Ajax实现JSP购物车功能原理
- NYOJ
- 欢迎使用CSDN-markdown编辑器
- RDD的两种操作算子
- Java 中 Vector、ArrayList、List 使用深入剖析
- [BZOJ4816]数字表格
- 表单元素 2017-4-6
- OkHttp3
- java 中的集合(十四) TreeMap源码分析
- 聊天室服务器基本代码
- Linux下socket编程,附带tcp例子
- 九度OJ题目1439:Least Common Multiple
- java练习--集合-List书店购物车
- ZOJ3207-80ers' Memory