并不对劲的bzoj4816:loj2000:p3704[SDOI2017]数字表格
题目大意
有函数\(f(x)\),\(f(0)=0,f(1)=1,f(x)=f(x-1)+f(x-2)\)
\(t\)(\(t\leq1000\))组询问,每次给定\(n,m\)(\(n,m\leq10^6\)),求:
\]
题解
这个人(点这里)讲得很清楚\(\color{white}{\text{shing太强了}}\)
假设\(n\)是\(n,m\)中较小的那个,讲一些在得出答案\(=\prod_{d=1}^{n}f(d)^{\sum_{k=1}^{\lfloor \frac{n}{d}\rfloor}{\mu(k)\lfloor \frac{n}{dk}\rfloor\lfloor \frac{m}{dk}\rfloor}}\)之后的事
设\(p=dk\)则有答案\(=\prod_{d=1}^{n}f(d)^{\sum_{d\mid p}^{n}{\mu(\frac{p}{d})\lfloor \frac{n}{p}\rfloor\lfloor \frac{m}{p}\rfloor}}\)
把幂次上的\(\sum\)拿下来变成\(\prod\),答案\(=\prod_{d=1}^{n}\prod_{d\mid p}^{n}f(d)^{{\mu(\frac{p}{d})\lfloor \frac{n}{p}\rfloor\lfloor \frac{m}{p}\rfloor}}=\prod_{d=1}^{n}(\prod_{d\mid p}^{n}f(d)^{\mu(\frac{p}{d})} )^{\lfloor \frac{n}{p}\rfloor\lfloor \frac{m}{p}\rfloor}\)
括号里的部分\(g(d)=\prod_{d\mid p}^{n}f(d)^{\mu(\frac{p}{d})}\)与\(n,m\)无关可以预处理,将每个\(f(a)^{\mu(b)}\)乘到\(g(a*b)\),预处理的时间复杂度为\(\frac{n}{1}+\frac{n}{2}+\frac{n}{3}+...+\frac{n}{n}\),大约是\(n*log n\)
接下来数论分块计算\(\prod_{d=1}^{n}g(d)^{\lfloor \frac{n}{p}\rfloor\lfloor \frac{m}{p}\rfloor}\)就行了,这部分的时间复杂度是\(\Theta(T(\sqrt n +\sqrt m))\)
代码
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define maxn 1000010
#define lim 1000000
#define LL long long
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x==0){putchar('0'),putchar('\n');return;}
int f=0;char ch[20];
if(x<0)putchar('-'),x=-x;
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar('\n');
return;
}
const LL mod=1e9+7;
int n,m,t,f[maxn],pf[maxn],g[maxn],pg[maxn],p[maxn],no[maxn],cnt,mu[maxn];
int mul(int x,LL y){int res=1;while(y){if(y&1ll)res=(LL)res*(LL)x%mod;x=(LL)x*(LL)x%mod,y>>=1;}return res;}
int main()
{
no[1]=mu[1]=1;
rep(i,2,lim)
{
if(!no[i])p[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*p[j]<=lim;j++)
{
no[i*p[j]]=1;
if(i%p[j]==0){mu[i*p[j]]=0;break;}
else mu[i*p[j]]=-mu[i];
}
}
f[1]=pf[1]=g[1]=1;
rep(i,2,lim)f[i]=(f[i-1]+f[i-2])%mod,pf[i]=mul(f[i],mod-2),g[i]=1;
rep(i,1,lim)
{
for(int j=i;j<=lim;j+=i)
{
if(mu[j/i]==1)g[j]=(LL)g[j]*(LL)f[i]%mod;
else if(mu[j/i]==-1)g[j]=(LL)g[j]*(LL)pf[i]%mod;
}
}g[0]=pg[0]=1;
rep(i,1,lim)g[i]=(LL)g[i-1]*(LL)g[i]%mod,pg[i]=mul(g[i],mod-2);
t=read();
while(t--)
{
n=read(),m=read();
if(n>m)swap(n,m);int ans=1;
for(int l=1,r=0;l<=n;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans=(LL)ans*mul((LL)g[r]*(LL)pg[l-1]%mod,(LL)(n/l)*(LL)(m/l))%mod;
}
write(ans);
}
return 0;
}
并不对劲的bzoj4816:loj2000:p3704[SDOI2017]数字表格的更多相关文章
- P3704 [SDOI2017]数字表格
P3704 [SDOI2017]数字表格 链接 分析: $\ \ \ \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} f[gcd(i, j)]$ $ ...
- bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格
洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...
- P3704 [SDOI2017]数字表格 (莫比乌斯反演)
[题目链接] https://www.luogu.org/problemnew/show/P3704 [题解] https://www.luogu.org/blog/cjyyb/solution-p3 ...
- 洛谷 P3704 [SDOI2017]数字表格(莫比乌斯函数)
题面传送门 题意: 求 \[\prod\limits_{i=1}^n\prod\limits_{j=1}^mfib_{\gcd(i,j)} \] \(T\) 组测试数据,\(1 \leq T \leq ...
- luogu P3704 [SDOI2017]数字表格
传送门 我是真的弱,推式子只能推一半 下面假设\(n<m\) 考虑题目要求的东西,可以考虑每个gcd的贡献,即\[\prod_{d=1}^{n}f[d]^{\sum_{i=1}^{\lfloor ...
- 洛咕 P3704 [SDOI2017]数字表格
大力推式子 现根据套路枚举\(\gcd(i,j)\) \(ans=\Pi_{x=1}^nfib[x]^{\sum_{i=1}^{n/x}\sum_{j=1}^{n/x}[\gcd(i,j)=1]}\) ...
- 洛谷P3704 [SDOI2017]数字表格(莫比乌斯反演)
传送门 yyb大佬太强啦…… 感觉还是有一点地方没有搞懂orz //minamoto #include<cstdio> #include<iostream> #include& ...
- 洛谷P3704 [SDOI2017]数字表格
题目描述 Doris刚刚学习了fibonacci数列.用f[i]f[i] 表示数列的第ii 项,那么 f[0]=0f[0]=0 ,f[1]=1f[1]=1 , f[n]=f[n-1]+f[n-2],n ...
- 洛谷 P3704 SDOI2017 数字表格
题意: 给定两个整数 \(n, m\),求: \[\prod_{i = 1} ^ n \prod_{j = 1} ^ m \operatorname{Fib}_{\gcd\left(n, m\righ ...
随机推荐
- CDOJ 1220 The Battle of Guandu
The Battle of Guandu Time Limit: 6000/3000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Oth ...
- poj1330+hdu2586 LCA离线算法
整整花了一天学习了LCA,tarjan的离线算法,就切了2个题. 第一题,给一棵树,一次查询,求LCA.2DFS+并查集,利用深度优先的特点,回溯的时候U和U的子孙的LCA是U,U和U的兄弟结点的子孙 ...
- CodeForces 595A Vitaly and Night
水题. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> u ...
- 洛谷—— P2002 消息扩散
P2002 消息扩散 题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市 ...
- MongoDB学习day06--高级查询aggregate聚合管道和nodejs操作aggregate
一.MongoDB聚合管道(Aggregation Pilpeline) 使用聚合管道可以对集合中的文档进行变换和组合. 主要功能:表的关联查询.数据统计 二.aggregate 管道操作符与表达式 ...
- java大文件的分割和合并
原文:http://www.open-open.com/code/view/1441679313430 import java.io.File; import java.io.FileInputStr ...
- 查看linux接口进出口流量的命令;linux 网络监控;流量监控
1.nload,左右键切换网卡 2.sudo iftop 3.sudo iptraf 按连接/端口查看流量 4.sudo nethogs: 按进程查看流量占用 5.ss: 连接查看工具 6.dstat ...
- 多线程调用COM组件的体会(CoInitialize)
调用任何COM组件之前,你必须首先初始化COM套件环境,即调用CoInitialize或CoInitializeEx.COM套件环境在线程的生存周期内有效,线程退出前需要调用CoUninitializ ...
- 【APUE】进程间通信之共享存储(mmap函数)
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只 ...
- Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻clientTab标签
之前用JakeWharton的开源框架ActionBarSherlock和ViewPager实现了对网易新闻clientTab标签的功能,ActionBarSherlock是在3.0下面的机器支持Ac ...