[数论][莫比乌斯反演] BZOJ 4816: 数字表格
来源:互联网 发布:apache velocity 编辑:程序博客网 时间:2024/05/16 09:07
Description
求
Solution
推一下柿子:
设
这里有一个小
因为每次累乘计算
#include <bits/stdc++.h>using namespace std;const int N = 1010101;const int MOD = 1000000007;typedef long long ll;inline char get(void) { static char buf[100000], *S = buf, *T = buf; if (S == T) { T = (S = buf) + fread(buf, 1, 100000, stdin); if (S == T) return EOF; } return *S++;}inline void read(int &x) { static char c; x = 0; for (c = get(); c < '0' || c > '9'; c = get()); for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0';}int f[N], fi[N], pref[N], prefi[N];int g[N], gi[N], preg[N], pregi[N];int prime[N], vis[N], mu[N];int lim = 1000000;int n, m, Pcnt, x, y, test, pos, ans;inline void Add(int &x, int t) { x += t; while (x >= MOD) x -= MOD;}inline int Pow(int a, ll b) { int c = 1; while (b) { if (b & 1) c = (ll)c * a % MOD; b >>= 1; a = (ll)a * a % MOD; } return c;}inline int Inv(int x) { return Pow(x, MOD - 2);}int main(void) { freopen("1.in", "r", stdin); mu[1] = 1; for (int i = 2; i <= lim; i++) { if (!vis[i]) { prime[++Pcnt] = i; mu[i] = -1; } for (int j = 1; j <= Pcnt && (x = i * prime[j]) <= lim; j++) { vis[x] = 1; if (i % prime[j]) { mu[x] = -mu[i]; } else { mu[x] = 0; break; } } } pref[0] = prefi[0] = 1; f[0] = fi[0] = 0; pref[1] = prefi[1] = f[1] = fi[1] = 1; for (int i = 2; i <= lim; i++) { Add(f[i] = f[i - 1], f[i - 2]); pref[i] = (ll)pref[i - 1] * f[i] % MOD; } prefi[lim] = Inv(pref[lim]); for (int i = lim; i >= 2; i--) { prefi[i - 1] = (ll)prefi[i] * f[i] % MOD; fi[i] = (ll)prefi[i] * pref[i - 1] % MOD; } for (int i = 1; i <= lim; i++) g[i] = gi[i] = 1; for (int i = 1; i <= lim; i++) for (int j = i; j <= lim; j += i) { if (mu[j / i] == 1) { x = f[i]; y = fi[i]; } else if (mu[j / i] == 0) { x = y = 1; } else { x = fi[i]; y = f[i]; } g[j] = (ll)g[j] * x % MOD; gi[j] = (ll)gi[j] * y % MOD; } preg[0] = pregi[0] = 1; for (int i = 1; i <= lim; i++) { preg[i] = (ll)preg[i - 1] * g[i] % MOD; pregi[i] = (ll)pregi[i - 1] * gi[i] % MOD; } read(test); while (test--) { read(n); read(m); ans = 1; if (n > m) swap(n, m); for (int i = 1; i <= n; i = pos + 1) { pos = min(n / (n / i), m / (m / i)); ans = (ll)ans * Pow((ll)preg[pos] * pregi[i - 1] % MOD, (ll)(n / i) * (m / i)) % MOD; } printf("%d\n", ans); } return 0;}
阅读全文
2 0
- [数论][莫比乌斯反演] BZOJ 4816: 数字表格
- bzoj 4816: [Sdoi2017]数字表格 莫比乌斯反演
- [莫比乌斯反演] BZOJ 4816 [Sdoi2017]数字表格
- bzoj2154: Crash的数字表格/2693: jzptab [莫比乌斯反演、数论推导]
- 【BZOJ2154】Crash的数字表格,数论练习之二维LCM(莫比乌斯反演)
- BZOJ 4176 Lucas的数论 莫比乌斯反演
- bzoj 4176 Lucas的数论 莫比乌斯反演
- 【BZOJ】【P2154】【Crash的数字表格】【题解】【莫比乌斯反演】
- BZOJ 2154 Crash的数字表格 莫比乌斯反演
- HYSBZ/BZOJ 2154 Crash的数字表格 - 莫比乌斯反演
- BZOJ-2154 && 2693 Crash的数字表格&&jzptab 莫比乌斯反演
- 【bzoj 2154】Crash的数字表格(莫比乌斯反演)
- BZOJ 2154(Crash的数字表格-莫比乌斯反演)
- BZOJ 2154 Crash的数字表格(sigma(lcm(i,j)),莫比乌斯反演)
- [莫比乌斯反演] BZOJ 2154 Crash的数字表格
- BZOJ 2154 Crash的数字表格(莫比乌斯反演)
- bzoj 2154: Crash的数字表格 莫比乌斯反演
- 【BZOJ 2154】Crash的数字表格 莫比乌斯反演
- numpy基础练习100题(71-100)
- 第四周项目1 建立单链表
- JDK8中新增StampedLock原理
- Codeforces Round #437 (Div. 2) B 865ASave the problem! (思维)
- 树遍历方式总结:层次遍历、先序遍历、中序遍历、后序遍历
- [数论][莫比乌斯反演] BZOJ 4816: 数字表格
- 单源最短路径:迪杰斯特拉算法
- JAVA异常
- Spring 学习笔记(9-30)
- KMP算法过程
- PHP JavaScript横向总结、对比(2.数组,类(对象))
- TX2刷机
- PHP字符串函数
- poj3565 Ants(KM)