Portal -->broken qwq

Description

​   求\(\prod\limits_{i=1}^n\prod\limits_{j=1}^m f[gcd(i,j)](mod\ 10^9+7)\),其中\(f[0]=0,f[1]=1,f[i]=f[i-1]+f[i-2]\)

​   数据范围:多组数据,数据组数\(T<=1000,1<=n,m<=10^6\)

Solution

​​   这题。。一开始我觉得这题好像直接求个范围内\(gcd(i,j)=d\)的对数就做完了qwq

​​   式子长这个样子

\[\begin{aligned}
Ans&=\prod\limits_{d=1}^{min(n,m)}f(d)^{s(d)}\\
s(d)&=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[gcd(i,j)=d]\\
&=\sum\limits_{k=1}^{\lfloor\frac{min(n,m)}{d}\rfloor}\mu(k)\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor
\end{aligned}
\]

​   然后发现单组\(O(n\sqrt n logn)\)然后数据组数\(1000\)==(不过还是有60)

​  (然而实际上也是可以做的==详见后面的update)

​​  

​​   正解并没有题面那么简单qwq实际上正解很妙qwq

​​   我们考虑构造一个函数\(g(x)\),满足:

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

​​   这样一来我们就可以把原来的式子化一下变成:

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

​​   然后这样我们就不用再在外面枚举一次了,单组复杂度\(O(\sqrt nlogn)\)

​​   前提是我们知道\(g(d)\)的前缀积

​   这个东西长得跟反演式子差不多,考虑反演式子的容斥解释,本质上就是容斥的加加减减,换成乘法的话就是乘除就好了,所以我们直接将\(\mu\)搬到指数上面就好了

\[g(n)=\prod\limits_{d|n}f(d)^{\mu(\frac{n}{d})}
\]

​   这个可以大力枚举约数什么的直接预处理

​   然后这题就做完啦ovo

​  

​   重大update!!

​   这题其实用最上面一开始推的那个式子也是可以做的!只不过。。我们可以把指数的式子少化一步变成:

\[s(d)=\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}[gcd(i,j)=1]
\]

​   然后我们会发现底数也是可以分块的!我们预处理一下\(f\)的前缀积,然后直接大力分块一下就好了(注意\(f[0]=0\)的情况在求逆元的时候返回\(1\))

​   这种做法的话。。很暴力但是可以压线过==算是一种水法吧。。不过因为式子非常好推场上比较容易想到所以还是记录一下

​   复杂度的话给给全说因为和不预处理的杜教筛形式类似所以是。。\(O(n^{\frac{3}{4}})\)的然后一定要算的话。。再加上一个\(\sqrt n logn\)(快速幂)

​  

​​   正解的代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e6+10,MOD=1e9+7;
int f[N],g[N],p[N],miu[N],invf[N],invg[N];
int vis[N];
int n,m,T,ans;
int add(int x,int y){return (1LL*x+MOD+y)%MOD;}
int mul(int x,int y){return 1LL*x*y%MOD;}
int ksm(int x,ll y){
int ret=1,base=x;
for (;y;y>>=1,base=mul(base,base))
if (y&1) ret=mul(ret,base);
return ret;
}
int inv(int x){return ksm(x,MOD-2);}
void prework(int n){
int cnt=0;
miu[1]=1;
for (int i=2;i<=n;++i){
if (!vis[i])
p[++cnt]=i,miu[i]=-1;
for (int j=1;j<=cnt&&p[j]*i<=n;++j){
vis[i*p[j]]=true;
if (i%p[j]==0){
miu[i*p[j]]=0;
break;
}
else
miu[i*p[j]]=-miu[i];
}
}
f[0]=0; f[1]=1; g[1]=1;
for (int i=2;i<=n;++i) f[i]=add(f[i-1],f[i-2]),g[i]=1;
for (int i=1;i<=n;++i) invf[i]=inv(f[i]);
for (int i=1;i<=n;++i)
for (int j=i;j<=n;j+=i){
if (miu[j/i]==-1)
g[j]=mul(g[j],invf[i]);
else if (miu[j/i]==1)
g[j]=mul(g[j],f[i]);
}
for (int i=2;i<=n;++i) g[i]=mul(g[i],g[i-1]);
invg[0]=1;
for (int i=1;i<=n;++i) invg[i]=inv(g[i]);
}
int solve(){
int ret=1;
if (n>m) swap(n,m);
for (int i=1,pos=0;i<=n;i=pos+1){
pos=min(n/(n/i),m/(m/i));
ret=mul(ret,ksm(mul(g[pos],invg[i-1]),1LL*(n/i)*(m/i)));
}
return ret;
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d",&T);
prework(N-10);
for (int o=1;o<=T;++o){
scanf("%d%d",&n,&m);
ans=solve();
printf("%d\n",ans);
}
}

​  

​   水法的代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e6+10,MOD=1e9+7,inf=2147483647;
ll f[N],miu[N],p[N];
int vis[N];
int n,m,T;
int mul(int x,int y){return 1LL*x*y%MOD;}
int add(int x,int y){return (1LL*x+y)%MOD;}
void prework(int n){
int cnt=0;
miu[1]=1;
for (int i=2;i<=n;++i){
if (!vis[i]){
p[++cnt]=i; miu[i]=-1;
}
for (int j=1;j<=cnt&&i*p[j]<=n;++j){
vis[i*p[j]]=1;
if (i%p[j])
miu[i*p[j]]=-miu[i];
else{
miu[i*p[j]]=0; break;
}
}
}
for (int i=2;i<=n;++i) miu[i]+=miu[i-1];
f[0]=0; f[1]=1;
for (int i=2;i<=n;++i) f[i]=add(f[i-1],f[i-2]);
for (int i=2;i<=n;++i) f[i]=mul(f[i],f[i-1]);
}
int ksm(int x,ll y){
int ret=1,base=x;
for (;y;y>>=1,base=mul(base,base))
if (y&1) ret=mul(ret,base);
return ret;
}
int inv(int x){return x==0?1:ksm(x,MOD-2);}
ll s(int n,int m){
ll ret=0;
for (int i=1,pos=0;i<=n;i=pos+1){
pos=min(n/(n/i),m/(m/i));
//ret=add(ret,mul(add(miu[pos],-miu[i-1]),mul(n/i,m/i)));
ret+=1LL*(n/i)*(m/i)*(miu[pos]-miu[i-1]);
}
return ret;
}
int solve(int n,int m){
int ret=1;
for (int i=1,pos=0;i<=n;i=pos+1){
pos=min(n/(n/i),m/(m/i));
ret=mul(ret,ksm(mul(f[pos],inv(f[i-1])),s(n/i,m/i)));
}
return ret;
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d",&T);
prework(N-10);
for (int i=1;i<=T;++i){
scanf("%d%d",&n,&m);
if (n>m) swap(n,m);
printf("%d\n",solve(n,m));
}
}

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

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

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

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

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

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

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

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

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

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

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

  6. BZOJ 4816 数字表格

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

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

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

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

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

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

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

随机推荐

  1. windows下如何将Python文件打包成.exe可执行文件

    在使用Python做开发的时候,时不时会给自己编写了一些小工具辅助自己的工作,但是由于开发依赖环境问题,多数只能在自己电脑上运行,拿到其它电脑后就没法运行了.这显得很不方便,不符合我们的初衷,那么有没 ...

  2. Http协议工作特点和工作原理笔记

    工作特点: (1)B/S结构(Browser/Server,浏览器/服务器模式) (2)无状态 (3)简单快速.可使用超文本传输协议.灵活运行传输各种类型 工作原理: 客户端发送请求浏览器 -> ...

  3. HashMap 和 HashTable 到底哪不同 ?

    HashMap 和 HashTable 到底哪不同 ? 2017/05/29 | 分类: 基础技术 | 1 条评论 | 标签: HASHMAP, HASHTABLE 分享到: 原文出处: 程序员赵鑫 ...

  4. Python Requests库简单入门

    我对Python网络爬虫的学习主要是基于中国慕课网上嵩天老师的讲授,写博客的目的是为了更好触类旁通,并且作为学习笔记之后复习回顾. 1.引言 requests 库是一个简洁且简单的处理HTTP请求的第 ...

  5. Java微笔记(5)

    final关键字 super关键字

  6. 【IdentityServer4文档】- 使用客户端凭据保护 API

    使用客户端凭据保护 API quickstart 介绍了使用 IdentityServer 保护 API 的最基本场景. 接下来的场景,我们将定义一个 API 和一个想要访问它的客户端. 客户端将在 ...

  7. web登录密码加密

    文章:如何实现登录页面密码加密 文章:用RSA加密实现Web登录密码加密传输 文章:web登录用户名密码加密 知乎文章:Web前端密码加密是否有意义? 文章:记录一次黑客模拟攻击 成功拿到淘宝账号和密 ...

  8. 3dContactPointAnnotationTool开发日志(三三)

      添加背景图片后发现Runtime Transform Gizmo无法选中物体了:   于是改了一下EditorObjectSelection.cs中的WereAnyUIElementsHovere ...

  9. inux下mysql的root密码忘记解决方法

    1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录 ...

  10. Jmeter 中JDBC request 详解 !

    JDBC Request: 这个sampler可以向数据库发送一个jdbc请求(sql语句),它经常需要和JDBC Connection Configuration 配置元件一起配合使用. 目录: 一 ...