【BZOJ4816】数字表格(莫比乌斯反演)
【BZOJ4816】数字表格(莫比乌斯反演)
题面
BZOJ
求
\]
题解
忽然不知道这个要怎么表示。。。
就写成这样吧。。
\]
直接把\(f[d]\)提出来
\]
上面那个东西用莫比乌斯反演+数论分块可以\(O(\sqrt n)\)求
外面套的这一层也可以数论分块求
于是,我们就得到了一个\(O(n)\)的做法
但是显然还不够
把上面那坨东西拎出来看
\]
太熟悉了
\]
还是老套路,
令\(T=id\)
直接把\(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】数字表格(莫比乌斯反演)的更多相关文章
- [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)
[BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...
- 【BZOJ4816】【SDOI2017】数字表格 [莫比乌斯反演]
数字表格 Time Limit: 50 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Doris刚刚学习了fibonac ...
- 【bzoj4816】[Sdoi2017]数字表格 莫比乌斯反演
题目描述 Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生 ...
- BZOJ4816 SDOI2017 数字表格 莫比乌斯反演
传送门 做莫比乌斯反演题显著提高了我的\(\LaTeX\)水平 推式子(默认\(N \leq M\),分数下取整,会省略大部分过程) \(\begin{align*} \prod\limits_{i= ...
- BZOJ 2154: Crash的数字表格 [莫比乌斯反演]
2154: Crash的数字表格 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2924 Solved: 1091[Submit][Status][ ...
- 【bzoj2154】Crash的数字表格 莫比乌斯反演
题目描述 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, ...
- [Sdoi2017]数字表格 [莫比乌斯反演]
[Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...
- 【BZOJ】2154: Crash的数字表格 莫比乌斯反演
[题意]给定n,m,求Σlcm(i,j),1<=i<=n,1<=j<=m,n,m<=10^7. [算法]数论(莫比乌斯反演) [题解] $$ans=\sum_{i\leq ...
- [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∑Ny=1∑Mlim(x, ...
- BZOJ.4816.[SDOI2017]数字表格(莫比乌斯反演)
题目链接 总感觉博客园的\(Markdown\)很..\(gouzhi\),可以看这的. 这个好像简单些啊,只要不犯sb错误 [Update] 真的算反演中比较裸的题了... \(Descriptio ...
随机推荐
- codeforces 940D 比赛总结
这次比赛总体还行,但是并没发挥到极致 A题 速度正常 题解 B题 这个题先是没注意时间复杂度,tle了,好不容易优化了没多测几组就交了,很开心的wa了,查了一边发现没特判k,改好后有草率地交了,又wa ...
- CentOS7 安装 Tomcat
安装 JDK Tomcat 的安装依赖 JDK,在安装 Tomcat 之前需要先安装 Java JDK.输入命令 java -version,如果显示 JDK 版本,证明已经安装了 JDK java ...
- centos7 yum与Python3冲突
虽然标题不严谨,但是,我自己尝试了多次,在安装了Python3.6后,yum无法同步Python.所以采用网上抄来抄去的做法,将yum指定使用Python2,凡是需要安装与Python相关的模块,使用 ...
- Git版本控制的基本命令
安装完了GIT首先要自报家门,否则代码不能提交 git config --global user.name "Your Name" git config --global user ...
- Flask Ansible自动化平台搭建(持续更新)
一:简介 使用Ansible + Flask + Celery搭建web平台. 目录结构 . ├── ansible_api │ ├── ansible_playbook_inventory.py ...
- win10安装mongodb及配置 和 mongodb的基本使用(node环境)
mongodb安装 下载地址: https://www.mongodb.com/download-center 下载后,我们点击mongodb-win32-x86_64-2008plus-ssl-3. ...
- JavaScript基础教程1-20160612
1.javascript是一门浏览器运行的脚本语言和java没关系 2.javascript语言写在哪里? (1)可以写单独的文件里面去调用(推荐采用此方法) index.html <head& ...
- Java中equal和==区别及String创建过程
Java中equal和==区别 1.起因 在一段Java代码中,使用了两种实现方式. //第一种命令行输入 int main (String[] args) { if(args[0] == " ...
- hi3531spi flash启动和bootrom启动的对比
a
- VBR与CBR的区别是什么?
VBR是动态码率.CBR是静态码率. VBR(Variable Bitrate)动态比特率.也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么比特率,这是以质量为前提兼顾文件大小的方 ...