题目描述

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取模。

输入

有多组测试数据。

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

输出

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

样例输入

3
2 3
4 5
6 7

样例输出

1
6
960


题解

莫比乌斯反演

$\prod\limits_{i=1}^n\prod\limits_{j=1}^mf(\gcd(i,j))\\=\prod\limits_{d=1}^{min(n,m)}(\prod\limits_{i=1}^n\prod\limits_{j=1}^m[\gcd(i,j)=d]·f(d))\\=\prod\limits_{d=1}^{min(n,m)}f(d)^{\sum\limits_{i=1}^n\sum\limits_{j=1}^m[\gcd(i,j)=d]}\\=\prod\limits_{d=1}^{min(n,m)}f(d)^{\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor \frac md\rfloor}[\gcd(i,j)=1]}\\=\prod\limits_{d=1}^{min(n,m)}f(d)^{\sum\limits_{i=1}^{\lfloor\frac nd\rfloor}\sum\limits_{j=1}^{\lfloor \frac md\rfloor}\sum\limits_{k|i\&k\&j}\mu(d)}\\=\prod\limits_{d=1}^{min(n,m)}f(d)^{\sum\limits_{k=1}^{min(\lfloor\frac nd\rfloor,\lfloor\frac md\rfloor)}\mu(k)\lfloor\frac n{dk}\rfloor\lfloor\frac m{dk}\rfloor}$

到了这一步我们可以选择分块套分块,不过显然时间复杂度不足以应对多组询问。

继续令$D=dk$,可以得到:

$\prod\limits_{d=1}^{min(n,m)}f(d)^{\sum\limits_{k=1}^{min(\lfloor\frac nd\rfloor,\lfloor\frac md\rfloor)}\mu(k)\lfloor\frac n{dk}\rfloor\lfloor\frac m{dk}\rfloor}\\=\prod\limits_{D=1}^{min(n,m)}(\prod\limits_{d|D}f(d)^{\mu(\frac Dd)})^{\lfloor\frac nD\rfloor\lfloor\frac mD\rfloor}\\=\prod\limits_{D=1}^{min(n,m)}(t(D))^{\lfloor\frac nD\rfloor\lfloor\frac mD\rfloor}\\(t(D)=\prod\limits_{d|D}f(d)^{\mu(\frac Dd)})$

于是线性筛出$\mu$,递推出f,预处理出f的逆元,进而使用$O(n\ln n)$的时间预处理出t数组。这里有一个小技巧:先枚举$\frac Dd$,当它的$\mu$值等于0时不作任何处理。亲测可以有效减少时间。

然后预处理出t数组之后分块处理询问即可。

时间复杂度为O(跑得过)$O(n\ln n+T\sqrt n)$,实际上跑了37s。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1000010
using namespace std;
typedef long long ll;
const int k = 1000000 , mod = 1000000007;
int mu[N] , prime[N] , tot;
ll f[N] , inv[N] , t[N] , sum[N];
bool np[N];
ll pow(ll x , ll y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
int main()
{
int i , j , T , n , m;
ll ans;
sum[0] = t[1] = f[1] = inv[1] = mu[1] = 1;
for(i = 2 ; i <= k ; i ++ )
{
t[i] = 1 , f[i] = (f[i - 1] + f[i - 2]) % mod , inv[i] = pow(f[i] , mod - 2) % mod;
if(!np[i]) mu[i] = -1 , prime[++tot] = i;
for(j = 1 ; j <= tot && i * prime[j] <= k ; j ++ )
{
np[i * prime[j]] = 1;
if(i % prime[j] == 0)
{
mu[i * prime[j]] = 0;
break;
}
else mu[i * prime[j]] = -mu[i];
}
}
for(j = 1 ; j <= k ; j ++ )
{
if(!mu[j]) continue;
for(i = 1 ; i * j <= k ; i ++ )
{
if(mu[j] == 1) t[i * j] = t[i * j] * f[i] % mod;
else t[i * j] = t[i * j] * inv[i] % mod;
}
}
for(i = 1 ; i <= k ; i ++ ) sum[i] = sum[i - 1] * t[i] % mod;
scanf("%d" , &T);
while(T -- )
{
scanf("%d%d" , &n , &m) , ans = 1;
for(i = 1 ; i <= n && i <= m ; i = j + 1)
j = min(n / (n / i) , m / (m / i)) , ans = ans * pow(sum[j] * pow(sum[i - 1] , mod - 2) % mod , (ll)(n / i) * (m / i)) % mod;
printf("%lld\n" , ans);
}
return 0;
}

【bzoj4816】[Sdoi2017]数字表格 莫比乌斯反演的更多相关文章

  1. BZOJ4816 SDOI2017 数字表格 莫比乌斯反演

    传送门 做莫比乌斯反演题显著提高了我的\(\LaTeX\)水平 推式子(默认\(N \leq M\),分数下取整,会省略大部分过程) \(\begin{align*} \prod\limits_{i= ...

  2. [Sdoi2017]数字表格 [莫比乌斯反演]

    [Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...

  3. [bzoj4816][Sdoi2017]数字表格 (反演+逆元)

    (真不想做莫比乌斯了) 首先根据题意写出式子 ∏(i=1~n)∏(j=1~m)f[gcd(i,j)] 很明显的f可以预处理出来,解决 根据套路分析,我们可以先枚举gcd(i,j)==d ∏(d=1~n ...

  4. BZOJ.4816.[SDOI2017]数字表格(莫比乌斯反演)

    题目链接 总感觉博客园的\(Markdown\)很..\(gouzhi\),可以看这的. 这个好像简单些啊,只要不犯sb错误 [Update] 真的算反演中比较裸的题了... \(Descriptio ...

  5. BZOJ 4816 [Sdoi2017]数字表格 ——莫比乌斯反演

    大力反演出奇迹. 然后xjb维护. 毕竟T1 #include <map> #include <ctime> #include <cmath> #include & ...

  6. luogu3704 [SDOI2017]数字表格(莫比乌斯反演)

    link 设\(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)}\),多组询问, ...

  7. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

  8. [SDOI2017]数字表格 --- 套路反演

    [SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...

  9. 【BZOJ4816】【SDOI2017】数字表格 [莫比乌斯反演]

    数字表格 Time Limit: 50 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Doris刚刚学习了fibonac ...

随机推荐

  1. python基础教程总结5——函数

    1.函数创建 1).函数代码块以def关键词开头,后接函数标识符名称和圆括号()2).任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数3).函数的第一行语句可以选择性地使用文档字符串 ...

  2. 棋盘问题——POJ1321

    棋盘问题——深度优先搜索 题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘 ...

  3. mysql5.7.24 解压版安装步骤以及遇到的问题

    1.下载 https://dev.mysql.com/downloads/mysql/ 2.解压到固定位置,如D:\MySQL\mysql-5.7.24 3.添加my.ini文件 跟bin同级 [my ...

  4. echarts事件中获取当前实例

    直接使用this即可

  5. VMWare安装苹果Mac OS X

    随着iPhone.iPad.Mac等苹果产品越来越火爆,越来越多的初学者想要了解和尝试苹果平台,包括苹果操作系统Mac OS X.苹果演示软件Keynote.苹果开发工具Xcode等.然而,苹果电脑价 ...

  6. R,RJAVA 安装配置 详细版

    准备工作 系统必须已经安装JDK 并配置好了环境变量. 注:安装的jdk  r  以及系统 尽量保持位数一致   1.下载 R https://mirrors.tuna.tsinghua.edu.cn ...

  7. Python自学笔记_

    1. if语句 判断语句. 1 a=2 2 b=3 3 if a>b: 4 print("a>b") 5 else: 6 print("a<b" ...

  8. DELL PowerEdge R620安装Windows server(你想将windows安装在何处”找不到任何本地磁盘,“找不到驱动器”)已解决!

    你可能碰到过DELL服务器上安装Windows server系列系统时无法识别或找不到硬盘的问题,对于DELL PowerEdge11-14代机器的,大家可以采用DELL的Lifecycle cont ...

  9. linux的一些权限的操作 chmod

    u ---属主 g ---用户组 o ---其他组 + ----赋予权限 - ----取消权限 = ----赋予权限并取消以前的权限 r = 4   //读 w =2   //写 x =1   //执 ...

  10. Thinkphp5 的常用连式查询

    目录 取出表中改字符串前两位等于01的数据 按主键查询 不按主键查 JOIN方法 的左右连接 not in 方法 like 查询 where 按条件筛选查询 取出表中改字符串前两位等于01的数据 $p ...