数字表格(product)
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
式子长这个样子
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)\),满足:
\]
这样一来我们就可以把原来的式子化一下变成:
&\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\)搬到指数上面就好了
\]
这个可以大力枚举约数什么的直接预处理
然后这题就做完啦ovo
重大update!!
这题其实用最上面一开始推的那个式子也是可以做的!只不过。。我们可以把指数的式子少化一步变成:
\]
然后我们会发现底数也是可以分块的!我们预处理一下\(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)的更多相关文章
- [Sdoi2017]数字表格 [莫比乌斯反演]
[Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...
- BZOJ 2154: Crash的数字表格 [莫比乌斯反演]
2154: Crash的数字表格 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2924 Solved: 1091[Submit][Status][ ...
- 【BZOJ】【2154】Crash的数字表格
莫比乌斯反演 PoPoQQQ讲义第4题 题解:http://www.cnblogs.com/jianglangcaijin/archive/2013/11/27/3446169.html 感觉两次sq ...
- 【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&&BZOJ 2693 jzptab)
BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b ...
- 【BZOJ 2154】Crash的数字表格 (莫比乌斯+分块)
2154: Crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能 ...
- BZOJ 4816 数字表格
首先是惯例的吐槽.SDOI题目名称是一个循环,题目内容也是一个循环,基本上过几年就把之前的题目换成另一个名字出出来,喜大普奔亦可赛艇.学长说考SDOI可以考出联赛分数,%%%. 下面放解题报告.并不喜 ...
- BZOJ:4816: [Sdoi2017]数字表格
4816: [Sdoi2017]数字表格 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 501 Solved: 222[Submit][Status ...
- 【BZOJ4816】数字表格(莫比乌斯反演)
[BZOJ4816]数字表格(莫比乌斯反演) 题面 BZOJ 求 \[\prod_{i=1}^n\prod_{j=1}^mf[gcd(i,j)]\] 题解 忽然不知道这个要怎么表示... 就写成这样吧 ...
- 【BZOJ2154】Crash的数字表格(莫比乌斯反演)
[BZOJ2154]Crash的数字表格(莫比乌斯反演) 题面 BZOJ 简化题意: 给定\(n,m\) 求\[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j)\] 题解 以下的一切都 ...
随机推荐
- 纯CSS3实现旋转木马
test.html: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...
- tensorflow中tensor与数组之间的转换
# 主要是两个方法: # 1.数组转tensor:数组a, tensor_a=tf.convert_to_tensor(a) # 2.tensor转数组:tensor b, array_b=b.eva ...
- 宿主机ssh免密登录docker容器
一.检查系统内核 二.安装docker 1.yum install docker -y 2.docker version #查看docker版本 3.syste ...
- 在GPT格式的硬盘上,使用EFI启动的方式,安装Win7 64位系统
Win7 sp1 原装系统,用UltraISO(软碟通) 把U 盘制成Win7 安装的启动U盘 将bootmgfw.efi和shell.efi 加到已制好启动U盘的根目录,并在efi/boot/路径下 ...
- Firefox必备的24款web开发插件
from: 软件过滤: 排序:收录时间 | 浏览数 网页开发FireFox插件 Firebug Firebug是Firefox下的一款开发类插件,现属于Firefox的 五星级强力推荐插件之一.它集H ...
- 小白用Android MVP-初体验(一)
写android以来,一直都是采用MVC的模式,所有的业务逻辑,网络请求等都放在了View中,即Activity或者Fragment中.看了一些mvp文章,很多跨度较大,也因为自己造诣不够,还不能跟上 ...
- ansible介绍和安装
ansible是由 Python 编写的强大的配置管理解决方案,ansible 的特点就在于它的简洁与高效率 ansible与其他的配置管理工具不同点在于:不需要你在想要配置的每个节点上安装自己的组件 ...
- 【week10】psp
项目 内容 开始时间 结束时间 中断时间 净时间 2016/11/19(星期六) 写博客 吉林一日游规格说明书 10:30 15:10 20 260 2016/11/20(星期日) 看论文 磷酸化+三 ...
- Hive查看执行日志
HIVE-如何查看执行日志 HIVE既然是运行在hadoop上,最后又被翻译为MapReduce程序,通过yarn来执行.所以我们如果想解决HIVE中出现的错误,需要分成几个过程 HIVE自身翻译成为 ...
- php PDO操作类
<?php /*//pdo连接信息 $pdo=array("mysql:host=localhost;dbname=demo;charset=utf8","root ...