【BZOJ4816】数字表格(莫比乌斯反演)

题面

BZOJ

\[\prod_{i=1}^n\prod_{j=1}^mf[gcd(i,j)]
\]

题解

忽然不知道这个要怎么表示。。。

就写成这样吧。。

\[\prod_{d=1}^n\prod_{i=1}^n\prod_{j=1}^mif(gcd(i,j)==d)f[gcd(i,j)]
\]

直接把\(f[d]\)提出来

\[\prod_{d=1}^{n}f[d]^{\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)==1]}
\]

上面那个东西用莫比乌斯反演+数论分块可以\(O(\sqrt n)\)求

外面套的这一层也可以数论分块求

于是,我们就得到了一个\(O(n)\)的做法

但是显然还不够

把上面那坨东西拎出来看

\[\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)==1]
\]

太熟悉了

\[\sum_{i=1}^{n/d}\mu(i)[\frac{n}{id}][\frac{m}{id}]
\]

还是老套路,

令\(T=id\)

直接把\(T\)在整个式子里面提出来

\[\prod_{T=1}^{n}\prod_{d|T}f[d]^{[n/T][m/T]\mu(T/d)}
\]

有一些一样的东西

\[\prod_{T=1}^{n}(\prod_{d|T}f[d]^{\mu(T/d)})^{[n/T][m/T]}
\]

然后怎么办。。。。

很明显,已经可以对\([n/T][m/T]\)分块了

那。。。里面的东西怎么办。。。

又不能线性筛。。。

喂喂。。。不能线性筛就暴力算呀

数据范围\(10^6\)

每个数暴力算到他的倍数里面去

也就是\(\frac{n}{1}+\frac{n}{2}+.....\frac{n}{10^6}\)

这个东西也就是\(15n\)的样子

所以直接暴力把那个东西的前缀给求出来

就可以做到\(O(\sqrt n)\)求解了

补充几个问题

求\([\frac{n}{i}][\frac{m}{i}]\)次方的时候,可以直接膜一个\(1e9+6\)

这样会块很多。。。

然后就是斐波那契数列的逆元提前算出来

要不然在暴力求解的时候就会多个\(log\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MOD 1000000007
#define MAX 1000000
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int fpow(int a,int b)
{
int s=1;
while(b){if(b&1)s=1ll*a*s%MOD;a=1ll*a*a%MOD;b>>=1;}
return s;
}
int f[MAX+10],pri[MAX],tot;
int g[MAX+10];
int inv[MAX+10];
int F[MAX+10];
int mu[MAX+10];
bool zs[MAX+10];
int n,m;
void pre()
{
f[1]=g[1]=F[0]=F[1]=1;
mu[1]=1;zs[1]=true;
for(int i=2;i<=MAX;++i)
{
f[i]=(f[i-1]+f[i-2])%MOD;
g[i]=fpow(f[i],MOD-2);F[i]=1;
if(!zs[i])pri[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot&&i*pri[j]<=MAX;++j)
{
zs[i*pri[j]]=true;
if(i%pri[j])mu[i*pri[j]]=-mu[i];
else{break;}
}
}
for(int i=1;i<=MAX;++i)
{
if(!mu[i])continue;
for(int j=i;j<=MAX;j+=i)
F[j]=1ll*F[j]*(mu[i]==1?f[j/i]:g[j/i])%MOD;
}
for(int i=2;i<=MAX;++i)F[i]=1ll*F[i]*F[i-1]%MOD;
}
int main()
{
pre();
int T=read();
while(T--)
{
n=read(),m=read();
if(n>m)swap(n,m);
int i=1,j,inv,ans=1;
while(i<=n)
{
j=min(n/(n/i),m/(m/i));
inv=1ll*F[j]*fpow(F[i-1],MOD-2)%MOD;
ans=1ll*ans*fpow(inv,1ll*(n/i)*(m/i)%(MOD-1))%MOD;
i=j+1;
}
printf("%d\n",(ans+MOD)%MOD);
}
return 0;
}

【BZOJ4816】数字表格(莫比乌斯反演)的更多相关文章

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

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

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

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

  3. 【bzoj4816】[Sdoi2017]数字表格 莫比乌斯反演

    题目描述 Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生 ...

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

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

  5. BZOJ 2154: Crash的数字表格 [莫比乌斯反演]

    2154: Crash的数字表格 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2924  Solved: 1091[Submit][Status][ ...

  6. 【bzoj2154】Crash的数字表格 莫比乌斯反演

    题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, ...

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

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

  8. 【BZOJ】2154: Crash的数字表格 莫比乌斯反演

    [题意]给定n,m,求Σlcm(i,j),1<=i<=n,1<=j<=m,n,m<=10^7. [算法]数论(莫比乌斯反演) [题解] $$ans=\sum_{i\leq ...

  9. [bzoj 2693] jzptab & [bzoj 2154] Crash的数字表格 (莫比乌斯反演)

    题目描述 TTT组数据,给出NNN,MMM,求∑x=1N∑y=1Mlim(x,y)\sum_{x=1}^N\sum_{y=1}^M lim(x,y)\newlinex=1∑N​y=1∑M​lim(x, ...

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

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

随机推荐

  1. 自动创建字符设备,不需mknod

    自动创建设备文件 1.自动创建设备文件的流程 字符设备驱动模块 -->创建一个设备驱动class--->创建属于class的device--->调用mdev工具(自动完成)--> ...

  2. python学习:递归列出目录里的文件

    #!/usr/bin/python   import os import sys   def print_files(path):     lsdir = os.listdir(path)     d ...

  3. easyui验证扩展

    问题描述: 如上所示:当用户添加信息时,必须保证一个队伍一天只能有一条数据.所以在选择了报表日期的时候必须查询数据库里面当前队伍这一天的数据是否存在.如果不存在,即当前日期队伍没有数据,就可以进行数据 ...

  4. Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8479282.html 在Android中进程间通信是比较难的一部分,同时又非常 ...

  5. hdu1006 Tick and Tick

    原题链接 Tick and Tick 题意 计算时针.分针.秒针24小时之内三个指针之间相差大于等于n度一天内所占百分比. 思路 每隔12小时时针.分针.秒针全部指向0,那么只需要计算12小时内的百分 ...

  6. UVa230 Borrowers

    原题链接 UVa230 思路 这题输入时有一些字符串处理操作,可以利用string的substr()函数和find_last_of()函数更加方便,处理时不必更要把书名和作者对应下来,注意到原题书名的 ...

  7. UVA - 1371 Period 二分+dp

    思路:设字符串x的长度为n,y的长度为m,那么答案一定在[0, m]之间,那么可以二分求答案. d(i, j)表示第一个串前i个字符至少需要经过多少次才能的到第二个串的前j个字符,转移方程d(i, j ...

  8. 如何修改全部DevExpress控件的字体

    引用:https://www.devexpress.com/Support/Center/Question/Details/A2761 You can change the default font ...

  9. linux查看端口被占用等常用命令

    一   根据端口号 查找对应的服务 比如我们查查找端口号8189对应的服务是哪个 1  先根据端口号查找对应对的pid(进程id)为23367 netstat -anp  | grep 8189    ...

  10. java编程思想第四版第五章习题

    创建一个类, 它包含一个未初始化的String引用.验证该引用被Java初始化成了null package net.mindview.initialization; public class Test ...