luogu3704 [SDOI2017]数字表格(莫比乌斯反演)
设\(f_0=0,f_1=1,f_n=f_{n-1}+f_{n-2}(n\ge 2)\)
求\(\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)}\),多组询问,\(T\le1000,n,m\le10^6\)
推导过程稍微有点难,因为有prod而不是清一色的sum了 不过总体还是不难的
\(\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)}\)
\(=\prod_{p=1}^nf_p^{\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=p]}\)
\(=\prod_{p=1}^nf_p^{\sum_{i=1}^{n/p}\sum_{j=1}^{m/p}[\gcd(i,j)=1]}\)
\(=\prod_{p=1}^nf_p^{\sum_{i=1}^{n/p}\sum_{j=1}^{m/p}\sum_{d|i,d|j}\mu(d)}\)
\(=\prod_{p=1}^nf_p^{\sum_{d=1}^n\mu(d)\lfloor\frac n{pd}\rfloor\lfloor\frac m{pd}\rfloor}\)
\(=\prod_{p=1}^nf_p^{\sum_{d=1}^n\mu(d)\lfloor\frac n{pd}\rfloor\lfloor\frac m{pd}\rfloor}\)
\(=\prod_{q=1}^n\left(\prod_{d|q}f_{q/d}^{\mu(d)}\right)^{\lfloor\frac n{q}\rfloor\lfloor\frac m{q}\rfloor}\)
(就最后一步好像难一点
线性筛\(\mu\)
\(\prod_{d|q}f_{q/d}^{\mu(d)}\)部分可以nlogn枚举倍数预处理
然后做个前缀乘积,后面直接打个逆元就行了
\(O(t\sqrt n\log n)\)
#include <cstdio>
#include <iostream>
using namespace std;
const int p = 1000000007;
int f[1000010], invf[1000010], fuck = 1000000, mu[1000010], prime[1000000], tot;
int s[1000010];
bool vis[1000010];
int qpow(int x, long long y)
{
int res = 1;
while (y > 0)
{
if (y & 1) res = res * (long long)x % p;
x = x * (long long)x % p;
y >>= 1;
}
return res;
}
int main()
{
mu[1] = 1;
for (int i = 2; i <= fuck; i++)
{
if (vis[i] == false) prime[++tot] = i, mu[i] = -1;
for (int j = 1; j <= tot && i * prime[j] <= fuck; j++)
{
vis[i * prime[j]] = true;
if (i % prime[j] == 0) break;
mu[i * prime[j]] = -mu[i];
}
}
f[1] = invf[1] = s[1] = 1;
for (int i = 2; i <= fuck; i++) f[i] = (f[i - 1] + f[i - 2]) % p, invf[i] = qpow(f[i], p - 2), s[i] = 1;
for (int d = 1; d <= fuck; d++)
{
if (mu[d] == -1)
for (int q = d, cnt = 1; q <= fuck; q += d, cnt++)
s[q] = s[q] * (long long)invf[cnt] % p;
if (mu[d] == 1)
for (int q = d, cnt = 1; q <= fuck; q += d, cnt++)
s[q] = s[q] * (long long)f[cnt] % p;
}
s[0] = 1;
for (int i = 2; i <= fuck; i++) s[i] = s[i] * (long long)s[i - 1] % p;
int t;
scanf("%d", &t);
while (t --> 0)
{
int ans = 1;
int n, m; scanf("%d%d", &n, &m); if (n > m) { int t = n; n = m; m = t; }
for (int i = 1, j; i <= n; i = j + 1)
{
j = min(n / (n / i), m / (m / i));
ans = ans * (long long)qpow(s[j] * (long long)qpow(s[i - 1], p - 2) % p, (n / i) * (long long)(m / i)) % p;
}
printf("%d\n", ans);
}
return 0;
}
这次终于不用define int long long可
luogu3704 [SDOI2017]数字表格(莫比乌斯反演)的更多相关文章
- [Sdoi2017]数字表格 [莫比乌斯反演]
[Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...
- 【bzoj4816】[Sdoi2017]数字表格 莫比乌斯反演
题目描述 Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生 ...
- BZOJ4816 SDOI2017 数字表格 莫比乌斯反演
传送门 做莫比乌斯反演题显著提高了我的\(\LaTeX\)水平 推式子(默认\(N \leq M\),分数下取整,会省略大部分过程) \(\begin{align*} \prod\limits_{i= ...
- BZOJ.4816.[SDOI2017]数字表格(莫比乌斯反演)
题目链接 总感觉博客园的\(Markdown\)很..\(gouzhi\),可以看这的. 这个好像简单些啊,只要不犯sb错误 [Update] 真的算反演中比较裸的题了... \(Descriptio ...
- BZOJ 4816 [Sdoi2017]数字表格 ——莫比乌斯反演
大力反演出奇迹. 然后xjb维护. 毕竟T1 #include <map> #include <ctime> #include <cmath> #include & ...
- [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)
[BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...
- [SDOI2017]数字表格 --- 套路反演
[SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...
- 【BZOJ4816】【SDOI2017】数字表格 [莫比乌斯反演]
数字表格 Time Limit: 50 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Doris刚刚学习了fibonac ...
- BZOJ 2154: Crash的数字表格 [莫比乌斯反演]
2154: Crash的数字表格 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2924 Solved: 1091[Submit][Status][ ...
随机推荐
- redis学习三 redis持久化
1,快照持久化 1简介 redis可以通过创建快照来获得某个时间点上的内存内容的数据副本,有了副本之后,就可以将副本发送到其他redis服务器上从而创建相同数据的从服务器,同时快照留在原 ...
- HDLM命令dlnkmgr详解之四_monitor/offline/online
1. monitor 以一定的时间间隔监控hba或cha口的IO信息. 命令格式 监控hba口的IO信息: dlnkmgr monitor -hbaid HBA_ID [-intvl Interval ...
- spring整合mybatis的事物管理配置
一.基本配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:/ ...
- android-auto-scroll-view-pager (无限广告轮播图)
github 地址: https://github.com/Trinea/android-auto-scroll-view-pager Gradle: compile ('cn.trinea.andr ...
- day70-oracle PLSQL_02光标
涨工资之前员工的工资. 如果PLSQL程序没有commit的话,命令行这边的客户端是无法读到的.这是oracle数据库的隔离级别. 为什么在PLSQL程序中commit之后还是不行呢? PLSQL程序 ...
- mongoDB的学习
一:linux下安装mongoDB 1.在linux系统上安装MongoDB 上传安装包mongodb-linux-x86_64-3.0.6.tgz到linux系统的home目录下 tar -zxvf ...
- Codeforces 1108F (MST Unification) (树上倍增 or 改进 kruksal)
题意:给你一张n个节点和m条边的无向连通图, 你可以执行很多次操作,对某一条边的权值+1(对于每条边,可以不加,可以无限次加),问至少进行多少次操作,可以使这张图的最小生成树变得唯一,并且最小生成树的 ...
- UIActionSheet(操作列表)
#import "AppDelegate.h" @interface AppDelegate ()<UIActionSheetDelegate> @end @imple ...
- 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出
1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法 Shiro框架内部整合好缓存管理器, ...
- p3584 [POI2015]LAS
传送门 分析 f[i][S](S∈[0,4])表示第iii个食物没有被选/左边选/右边选/同时选的状态是由哪一个状态转移来的 我们需要满足两个条件: 每个人只能选择一个 改变选择之后不会比当前获得热 ...