题目链接

\(Description\)

用\(f_i\)表示\(fibonacci\)数列第\(i\)项,求\(\prod_{i=1}^{n}\prod_{j=1}^{m}f[gcd(i,j)]\)。

\(T<=10^3,n,m≤10^6\)


\(Solution\)

再来推式子(默认\(n<m\))

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

按照套路枚举\(gcd\)

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

考虑每个\(f[d]\)被乘了多少次

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

指数非常熟悉

\[\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)==1]=\sum_{i=1}^{n/d}\mu(i)\lfloor\frac{n}{id}\rfloor\left\lfloor\frac{m}{id}\right\rfloor
\]

现在指数可以数论分块,对\(f\)做一个前缀积之后外层也可以数论分块,这就可以做到每次询问\(O(nlogn)\)了。

但是这个式子还可以继续推,我们可以枚举\(id\)

令\(T=id\)

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

根据数学运算法则就可以这样算

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

括号里面的式子可以预处理,乘方可以数论分块,这样就可以单词询问\(O(\sqrt n logn)\)了。

#include<complex>
#include<cstdio>
using namespace std;
const int mod=1e9+7;
const int N=1e6+7;
int Q,n,m,tot;
int prime[N],mu[N],f[N],g[N],pro[N];
bool check[N];
int qread()
{
int x=0;
char ch=getchar();
while(ch<'0' || ch>'9')ch=getchar();
while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x;
}
int Fpow(long long b,int p)
{
long long res=1;
for(;p;p>>=1,b=b*b%mod)
if(p&1)res=res*b%mod;
return res;
}
void Init()
{
check[1]=1;
mu[1]=f[1]=pro[0]=pro[1]=g[1]=1;
for(int i=2;i<N;i++)
{
if(!check[i])prime[++tot]=i,mu[i]=-1;
for(int j=1;j<=tot && i*prime[j]<N;j++)
{
check[i*prime[j]]=1;
if(i%prime[j])mu[i*prime[j]]=-mu[i];
else break;
}
f[i]=(f[i-1]+f[i-2])%mod;pro[i]=1;
g[i]=Fpow(f[i],mod-2);
}
for(int i=1;i<N;i++)
{
if(!mu[i])continue;
for(int j=i;j<N;j+=i)
pro[j]=1ll*pro[j]*(mu[i]==1?f[j/i]:g[j/i])%mod;
}
for(int i=2;i<N;i++)
pro[i]=1ll*pro[i]*pro[i-1]%mod;
}
int main()
{
Init();
scanf("%d",&Q);
while(Q--)
{
n=qread();m=qread();
if(n>m)swap(n,m);
int ans=1;
for(int l=1,r;l<=n;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans=1ll*ans*Fpow(1ll*pro[r]*Fpow(pro[l-1],mod-2)%mod,1ll*(n/l)*(m/l)%(mod-1))%mod;
}
printf("%d\n",ans);
}
return 0;
}

BZOJ 4816[SDOI2017]数字表格(莫比乌斯反演)的更多相关文章

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

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

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

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

  3. BZOJ:4816: [Sdoi2017]数字表格

    4816: [Sdoi2017]数字表格 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 501  Solved: 222[Submit][Status ...

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

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

  5. bzoj 4816: [Sdoi2017]数字表格【莫比乌斯反演+逆元】

    把题意简化,就是要求 \[ \prod_{d=1}^{min(n,m)}f[d]^{\sum_{i=1}^{n}\sum_{j=1}^{m}e[gcd(i,j)==d]} \] 把幂用莫比乌斯反演转化 ...

  6. 【刷题】BZOJ 4816 [Sdoi2017]数字表格

    Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师 ...

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

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

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

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

  9. bzoj 4816 [Sdoi2017]数字表格——反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4816 \( ans=\prod\limits_{d=1}^{n}f[d]^{\sum\lim ...

随机推荐

  1. MATLAB datenum日期转换为Python日期

    摘要 MATLAB datenum时间格式参数众多,本文只简单关注 units 参数,即基准年份和计时度量(天.小时). 命令行演示在 ipython 和 Octave 中进行. 示例1:小时制,基准 ...

  2. SAP SD 信用检查相关

    SAP系统信用管理功能的介绍:    R/3系统具有强大的信用管理功能.系统可将来自于FI.SD的财务及销售信息进行汇总, 提供即时的信用数据;并可依据信用政策对订单及发货进行管理,有效地降低风险;并 ...

  3. windows2008 开启SNMP服务

    现在很多企业和公司管理服务器时都是通过网络监控软件对服务器的状态进行监控,在监控的时候大多是通过SNMP协议(简单网络管理协议)进行的,那么在我们的服务器端就需要开启此项服务,并进行简单的设置. 以下 ...

  4. intent 和 Broadcast Receiver之间的通信

    工作原理是通过封装一个service启动的一个线程产生的随机数封装到intent对象传递给Activity,Activity接受到后讲结果输出到屏幕. java的代码: package jm.out; ...

  5. Java操作JSON数据(4,end)--Jackson操作JSON数据

    Jackson是SpringBoot默认使用的JSON处理库,它可以轻松的将Java对象转换成JSON对象,同样也可以将JSON转换成Java对象.本文介绍下Jackson的基本使用方法,包括序列化和 ...

  6. 【Kafka】Exactly Once语义与事务

    Kafka在0.11.0.0之前的版本中只支持At Least Once和At Most Once语义,尚不支持Exactly Once语义. 但是在很多要求严格的场景下,如使用Kafka处理交易数据 ...

  7. 基于JPA的分页/排序实现

    Page<ClassOrder> findByMember_MemberID(long id, Pageable pageable); Controller代码: public Model ...

  8. Servlet HttpServletResponse对象、HttpServletRequest对象

    HttpServletResponse对象(response)的常用方法 setCharacterEncoding("utf-8")    //设置响应的编码字符集 setCont ...

  9. k8s的node节点无法调度的问题

    1.现象,创建deployment时 2.查看污点 [fedora@k8s-cluster--ycmwlao4q5wz-master- ~]$ kubectl describe node k8s-cl ...

  10. vue element-ui tree 根节点固定子节点懒加载 首次加载根节点并展开

    关键代码: <el-tree ref="foldTree" node-key="id" :highlight-current="true&quo ...