Description

Doris刚刚学习了fibonacci数列。用f[i]表示数列的第i项,那么
f[0]=0
f[1]=1
f[n]=f[n-1]+f[n-2],n>=2
Doris用老师的超级计算机生成了一个n×m的表格,第i行第j列的格子中的数是f[gcd(i,j)],其中gcd(i,j)表示i,
j的最大公约数。Doris的表格中共有n×m个数,她想知道这些数的乘积是多少。答案对10^9+7取模。

Input

有多组测试数据。

第一个一个数T,表示数据组数。
接下来T行,每行两个数n,m
T<=1000,1<=n,m<=10^6

Output

输出T行,第i行的数是第i组数据的结果

Sample Input

3
2 3
4 5
6 7

Sample Output

1
6
960

$$\prod_{d=1}^n\prod_{i=1}^n\prod_{j=1}^mif(gcd(i,j)==d)f[gcd(i,j)]$$

直接把$f[d]$提出来

$$\prod_{d=1}^{n}f[d]^{\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)==1]}$$

上面那个东西用莫比乌斯反演+数论分块可以$O(\sqrt n)$求

外面套的这一层也可以数论分块求

于是,我们就得到了一个$O(n)$的做法

但是显然还不够

把上面那坨东西拎出来看

$$\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}[gcd(i,j)==1]$$

太熟悉了

$$\sum_{i=1}^{n/d}\mu(i)[\frac{n}{id}][\frac{m}{id}]$$

还是老套路,

令$T=id$

直接把$T$在整个式子里面提出来

$$\prod_{T=1}^{n}\prod_{d|T}f[d]^{[n/T][m/T]\mu(T/d)}$$

有一些一样的东西

$$\prod_{T=1}^{n}(\prod_{d|T}f[d]^{\mu(T/d)})^{[n/T][m/T]}$$

然后怎么办。。。。

很明显,已经可以对$[n/T][m/T]$分块了

里面的东西不好处理,那么就暴力预处理F(T)数组

枚举i,j(i*j<=N)那么复杂度:

$\frac{n}{1}+\frac{n}{2}+.....\frac{n}{10^6}$

复杂度O(nlogn+Q√n)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long lol;
int Q[][];
const int NN=;
int N=;
int Mod=1e9+;
int f[NN+],F[NN+],inv[NN+],Inv[NN+],ans;
int mu[NN+],tot,prime[NN],n,m;
bool vis[NN+];
int qpow(int x,int y)
{
int res=;
while (y)
{
if (y&) res=1ll*res*x%Mod;
x=1ll*x*x%Mod;
y>>=;
}
return res;
}
int pow(int x1,int x2,int y)
{
if (y<)
{
return x2;
}
if (y==) return ;
if (y>)
{
return x1;
}
}
void pre()
{int i,j;
mu[]=;
for (i=;i<=N;i++)
{
if (vis[i]==)
{
tot++;
prime[tot]=i;
mu[i]=-;
}
for (j=;j<=tot;j++)
{
if (1ll*i*prime[j]>N) break;
vis[i*prime[j]]=;
if (i%prime[j]==)
{
mu[i*prime[j]]=;
break;
}
else mu[i*prime[j]]=-mu[i];
}
}
for (i=;i<=N;i++)
F[i]=;
for (i=;i<=N;i++)
{
for (j=;j<=N;j++)
{
if (1ll*i*j>N) break;
F[i*j]=(1ll*F[i*j]*pow(f[i],inv[i],mu[j]))%Mod;
}
}
}
int main()
{int T;
int i,j;
cin>>T;
for (i=;i<=T;i++)
{
scanf("%d%d",&Q[i][],&Q[i][]);
N=max(N,max(Q[i][],Q[i][]));
}
f[]=;f[]=;
for (i=;i<=N;i++)
{
f[i]=f[i-]+f[i-];
if (f[i]>Mod) f[i]-=Mod;
}
for (i=;i<=N;i++)
inv[i]=qpow(f[i],Mod-);
pre();
F[]=;
for (i=;i<=N;i++)
F[i]=(1ll*F[i]*F[i-])%Mod;
for (j=;j<=T;j++)
{
n=Q[j][];m=Q[j][];
if (n>m) swap(n,m);
int pos=;
ans=;
for (i=;i<=n;i=pos+)
{
if (n/(n/i)<m/(m/i)) pos=n/(n/i);
else pos=m/(m/i);
ans=(1ll*ans*qpow((1ll*F[pos]*qpow(F[i-],Mod-))%Mod,1ll*(n/i)*(m/i)%(Mod-)))%Mod;
}
printf("%d\n",ans);
}
}

[SDOI2017]数字表格的更多相关文章

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

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

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

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

  3. 【BZOJ 4816】 4816: [Sdoi2017]数字表格 (莫比乌斯)

    4816: [Sdoi2017]数字表格 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 666  Solved: 312 Description Do ...

  4. P3704 [SDOI2017]数字表格

    P3704 [SDOI2017]数字表格 链接 分析: $\ \ \ \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} f[gcd(i, j)]$ $ ...

  5. [SDOI2017]数字表格 --- 套路反演

    [SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...

  6. 题解-[SDOI2017]数字表格

    题解-[SDOI2017]数字表格 前置知识: 莫比乌斯反演</> [SDOI2017]数字表格 \(T\) 组测试数据,\(f_i\) 表示 \(\texttt{Fibonacci}\) ...

  7. [SDOI2017]数字表格 & [MtOI2019]幽灵乐团

    P3704 [SDOI2017]数字表格 首先根据题意写出答案的表达式 \[\large\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)} \] 按常规套路改为枚举 \(d ...

  8. bzoj4816 [Sdoi2017]数字表格

    Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师 ...

  9. 【刷题】BZOJ 4816 [Sdoi2017]数字表格

    Description Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师 ...

随机推荐

  1. Basic FIFO Queue

    Queue - 一种线程安全的FIFO实现 Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(threa ...

  2. Tornado 网站demo 一

    web服务器的工作过程 创建 listen socket, 在指定的监听端口, 等待客户端请求的到来 listen socket 接受客户端的请求, 得到 client socket, 接下来通过 c ...

  3. 关于Android 7.0(API24)相机的问题汇总

    在开发Android项目的时候,我们会用到相机,有些时候只是开发一个普通的扫码,仅仅赋予一下 权限 就好了,但是有些时候是需要拍照和从相册中获取照片的.我们在Android 5.0以及5.0之前调用相 ...

  4. python 面向对象之封装与类与对象

    封装 一,引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,小老虎一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装='隐藏',这种理解是相当片面的 二,先看如何隐藏 在 ...

  5. JAVA_SE基础——71.Random类制作随机验证码

    public class Demo5 { public static void main(String[] args) { char[] arr={'s','b','g','h','a','c'}; ...

  6. GZip 压缩及解压缩

    /// <summary> /// GZipHelper /// </summary> public class GZipHelper { /// <summary> ...

  7. node防xss攻击插件

    var xss = require('node-xss').clean; router.post("/orders/insert-orders", function (req, r ...

  8. redis命令详解

      redis中添加key value元素:set key value;       获取元素:get key ;   redis中添加集合:lpush key value1 value2 value ...

  9. angular2 学习笔记 ( unit test 单元测试 )

    第一次写单元测试. 以前一直都有听说 TDD 的事情. 今天总算是去尝试了一下. 先说说 TDD 的想法, 是这样的, 开发项目的流程 : 确定需求 -> 写类,接口,方法的名字(不写具体实现代 ...

  10. RTSP连接中断重连的问题

    最近在调查的一个问题. 起因是我司的一款数据链产品,15km数字图传,测试时发现视频画面经常会出现马赛克或卡顿. 图传设置了10Mbps速率,而视频码流是4Mbps,按道理不应该出现这种问题. 经过几 ...