Description

  



  

  

  

Solution

  

  一开始的时候我是这么推的(\(f(n)\)表示斐波那契数列的第\(n\)项)

\[\begin{aligned}
Ans&=\prod_{x=1}^{\min(n,m)}f(x)^{(\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=x])}\\
&=\prod_{x=1}^{\min(n,m)}f(x)^{\sum_{e=1}^{\min(\lfloor\frac nx\rfloor,\lfloor \frac mx\rfloor)}\mu(e)\lfloor\frac n {ex}\rfloor\lfloor\frac m {ex}\rfloor}\\
\end{aligned}
\]

​  然后我想,根号分段套根号分段,\(\mathcal O(\sqrt n(\log+\sqrt n))\)解决!嗯不错,一看数据组数1000........不过还是能拿70的分。

  

  

  

  题解的思路非常神。

  

  假设我们能构造一个函数\(g\),使得

\[f(n)=\prod_{d|n}g(d)
\]

​  那么答案就变成

\[\begin{aligned}
Ans&=\prod_{i=1}^n\prod_{j=1}^mf({\gcd(i,j))}\\
&=\prod_{i=1}^n\prod_{j=1}^m\prod_{d|i,d|j}g(d)\\
&=\prod_{d=1}^{\min(n,m)}g(d)^{\lfloor\frac nd\rfloor\lfloor\frac md\rfloor}
\end{aligned}
\]

  这样就可以在\(\mathcal O(2\sqrt n)\)的时间内处理每一个询问了。前提是我们知道\(g\)及其前缀积。

  

​  考虑式子\(f(n)=\prod_{d|n}g(d)\)十分像莫比乌斯反演,能否用类似的形式反演出\(g\)呢?

  

​  在\(\sum\)的意义下

\[g_n=\sum_{d|n}\mu(d)f({\frac nd})
\]

​  反演的本质是通过加减来容斥出所需要的组合。而在乘法的意义下,不就是通过乘除来容斥出所需要的组合吗?所以有:

\[g_n=\prod_{d|n}f({\frac nd})^{\mu(d)}=\prod_{d|n}f(d)^{\mu(\frac nd)}
\]

​  因此我们可以在\(\mathcal O(n \lg n)\)的时间内处理出\(g\)的取值和前缀积。那么上面的根号分段也就迎刃而解了。

  

  总体思路是仿造莫比乌斯反演构造一个可求函数,利用该函数化简式子使得答案求和式变得简明且复杂度较低,再通过传统根号分段求解。

  

  

  

Code

  

#include <cstdio>
using namespace std;
const int N=1e6+10,MOD=1e9+7,PMOD=MOD-1;
int n,m;
int fib[N],ifib[N],g[N],ig[N];
bool vis[N];
int p[N],pcnt,mu[N];
inline int min(int x,int y){return x<y?x:y;}
inline int fmi(int x,int y){
int res=1;
for(;y;x=1LL*x*x%MOD,y>>=1)
if(y&1) res=1LL*res*x%MOD;
return res;
}
void sieve(){
mu[1]=1;
for(int i=2;i<=1e6;i++){
if(!vis[i]) p[++pcnt]=i,mu[i]=-1;
for(int j=1;j<=pcnt&&i*p[j]<=1e6;j++){
int x=i*p[j];
vis[x]=true;
if(i%p[j]==0){
mu[x]=0;
break;
}
mu[x]=-mu[i];
}
}
}
void prework(){
sieve();
fib[0]=0; fib[1]=1; ifib[1]=1;
for(int i=2;i<=1e6;i++){
fib[i]=(fib[i-2]+fib[i-1])%MOD;
ifib[i]=fmi(fib[i],MOD-2);
}
for(int i=1;i<=1e6;i++) g[i]=1;
for(int d=1;d<=1e6;d++)
for(int n=d;n<=1e6;n+=d)
g[n]=1LL*g[n]*(mu[n/d]==1?fib[d]:(mu[n/d]==-1?ifib[d]:1))%MOD;
g[0]=ig[0]=1;
for(int i=1;i<=1e6;i++){
g[i]=1LL*g[i]*g[i-1]%MOD;
ig[i]=fmi(g[i],MOD-2);
}
}
int main(){
prework();
int T,up,ans;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
up=min(n,m);
ans=1;
for(int i=1,j;i<=up;i=j+1){
j=min(n/(n/i),m/(m/i));
ans=1LL*ans*fmi(1LL*g[j]*ig[i-1]%MOD,1LL*(n/i)*(m/i)%PMOD)%MOD;
}
printf("%d\n",ans<0?ans+MOD:ans);
}
return 0;
}

数字表格(product)的更多相关文章

  1. 数字表格(product)

    Portal -->broken qwq Description ​  求\(\prod\limits_{i=1}^n\prod\limits_{j=1}^m f[gcd(i,j)](mod\ ...

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

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

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

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

  4. 【BZOJ】【2154】Crash的数字表格

    莫比乌斯反演 PoPoQQQ讲义第4题 题解:http://www.cnblogs.com/jianglangcaijin/archive/2013/11/27/3446169.html 感觉两次sq ...

  5. 【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&&BZOJ 2693 jzptab)

    BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b ...

  6. 【BZOJ 2154】Crash的数字表格 (莫比乌斯+分块)

    2154: Crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能 ...

  7. BZOJ 4816 数字表格

    首先是惯例的吐槽.SDOI题目名称是一个循环,题目内容也是一个循环,基本上过几年就把之前的题目换成另一个名字出出来,喜大普奔亦可赛艇.学长说考SDOI可以考出联赛分数,%%%. 下面放解题报告.并不喜 ...

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

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

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

    [BZOJ4816]数字表格(莫比乌斯反演) 题面 BZOJ 求 \[\prod_{i=1}^n\prod_{j=1}^mf[gcd(i,j)]\] 题解 忽然不知道这个要怎么表示... 就写成这样吧 ...

  10. 【BZOJ2154】Crash的数字表格(莫比乌斯反演)

    [BZOJ2154]Crash的数字表格(莫比乌斯反演) 题面 BZOJ 简化题意: 给定\(n,m\) 求\[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\] 题解 以下的一切都 ...

随机推荐

  1. 我是如何将页面加载时间从6S降到2S的?

    写在前面 生活在信息爆炸的今天,我们每天不得不面对和过滤海量的信息--无疑是焦躁和浮动的,这就意味着用户对你站点投入的时间可能是及其吝啬的(当然有一些刚需站点除外). 如何给用户提供迅速的响应就显得十 ...

  2. Python遗传算法工具箱DEAP框架分析

    本文主要介绍python遗传算法工具箱DEAP的实现.先介绍deap的如何使用,再深入介绍deap的框架实现,以及遗传算法的各种实现算法. 代码可以参考 https://github.com/suma ...

  3. RHEL7 利用双网卡绑定实现VLAN

    使用nmcli创建bond配置 #nmcli connection add type bond ifname bond0 con-name bond0 mode active-backup #nmcl ...

  4. 某简单易懂的人脸识别 API 的开发环境搭建和简易教程

    最近接了个人脸识别相关的项目,是基于某个非常简单易懂的人脸识别 API:face_recognition 做的.这个库接口非常傻瓜,很适合新手上手,而且可以研究其源码来学习 dlib 这个拥有更加灵活 ...

  5. 【RL系列】Multi-Armed Bandit笔记补充(二)

    本篇的主题是对Upper Conference Bound(UCB)策略进行一个理论上的解释补充,主要探讨UCB方法的由来与相关公式的推导. UCB是一种动作选择策略,主要用来解决epsilon-gr ...

  6. ubuntu下修改nginx的进程数

    1. 进入nginx配置文件:vim /etc/nginx/nginx.conf2. 将events下的worker_processes 修改为 你希望的数字,保存文件并退出3. 重启nginx: s ...

  7. Python之并发编程-协程

    目录 一.介绍 二. yield.greenlet.gevent介绍 1.yield 2.greenlet 3.gevent 一.介绍 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutin ...

  8. php 把数字转化为大写中文

    PHP 数字转大写中文 PHP入门小菜鸟一枚.下午要求写一个把数字转成大写中文的脚本,百度了一波,几十个博客和网站都是用的那四个代码,第一个运行不了,第二个有问题,不合要求,第三个第四个太长,懒得看, ...

  9. charles使用教程 干货~

    大部分内容来自前辈们的摘写,博客园是怎么去转载其他好的博呢~ 言归正传,教程看过后还是自己再来一遍理解和操作才会更加深刻. Charles 是在 Mac/WIN下常用的网络封包截取工具,在做移动开发时 ...

  10. Robot Framework 教程 (4) - 自定义Library

    RobotFrame Work为我们提供了包括OS.Android.XML.FTP.HTTP.DataBase.Appium.AutoIt.Selenium.Watir等大量的库.在使用过程中,除这些 ...