题目链接


问题分析

\[
\begin{aligned}
Ans&=\prod_{i=1}^n\prod_{j=1}^mf[\gcd(i,j)]\\
&=\prod_{t=1}^nf(t)^{\sum\limits_{i=1}^n\sum\limits_{j=1}^m[\gcd(i,j)=t]}\\
&=\prod_{t=1}^nf(t)^{\sum\limits_{t|d}^n\mu(\frac{d}{t})\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor}\\
&=\prod_{t=1}^n\prod_{t|d}f(t)^{\mu(\frac{d}{t})\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor}\\
&=\prod_{d=1}^n\prod_{t|d}f(t)^{\mu(\frac{d}{t})\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor}\\
&=\prod_{d=1}^{n}[\prod_{t|d}f(t)^{\mu(\frac{d}{t})}]^{\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor}
\end{aligned}
\]

其中对$\sum\limits_^n\sum\limits_^m[\gcd(i,j)=t]$进行莫比乌斯反演。

设$f(t)=\sum\limits_^n\sum\limits_^m[\gcd(i,j)=t]$。设$F(t)=\sum\limits_^n\sum\limits_^m[t|\gcd(i,j)]=\lfloor\frac\rfloor\lfloor\frac\rfloor$。

因为$F(t)=\sum\limits_{t|d}f(d)$,所以$f(t)=\sum\limits_{t|d}\mu(\frac)F(d)=\sum\limits_{t|d}\mu(\frac)\lfloor\frac\rfloor\lfloor\frac\rfloor$。

最后的式子中,中括号内的东西可以$O(n\log n)$预处理。然后对于每个询问进行整除分块。如果不考虑快速幂,时间复杂度就是$O(T\sqrt n+n\log n)$。

参考代码

#include <bits/stdc++.h>
#define LL long long
using namespace std; const LL Maxn = 1000010;
const LL N = 1000000;
const LL Mod = 1000000007;
LL Num, Prime[ Maxn ], Vis[ Maxn ], Mu[ Maxn ], F[ Maxn ], G[ Maxn ]; LL Power( LL x, LL y ) {
if( y == 0 ) return 1LL;
LL t = Power( x, y >> 1 );
t = t * t % Mod;
if( y & 1 ) t = t * x % Mod;
return t;
} void Init() {
F[ 0 ] = 0; F[ 1 ] = 1;
for( int i = 2; i <= N; ++i )
F[ i ] = ( F[ i - 1 ] + F[ i - 2 ] ) % Mod;
Mu[ 1 ] = 1;
for( int i = 2; i <= N; ++i ) {
if( !Vis[ i ] ) {
Mu[ i ] = -1;
Prime[ ++Num ] = i;
}
for( int j = 1; j <= Num && i * Prime[ j ] <= N; ++j ) {
Vis[ i * Prime[ j ] ] = 1;
if( i % Prime[ j ] ) break;
Mu[ i *Prime[ j ] ] = -Mu[ i ];
}
}
for( int i = 0; i <= N; ++i ) G[ i ] = 1;
for( int i = 1; i <= N; ++i ) {
for( int j = i; j <= N; j += i ) {
if( Mu[ j / i ] == 1 )
G[ j ] = G[ j ] * F[ i ] % Mod;
if( Mu[ j / i ] == -1 )
G[ j ] = G[ j ] * Power( F[ i ], Mod - 2 ) % Mod;
}
}
for( int i = 1; i <= N; ++i ) G[ i ] = G[ i ] * G[ i - 1 ] % Mod;
return;
} void Work() {
LL n, m;
LL Ans = 1;
scanf( "%lld%lld", &n, &m );
if( n > m ) swap( n, m );
for( int i = 1, j; i <= n; i = j + 1 ) {
j = min( ( n / ( n / i ) ), ( m / ( m / i ) ) );
Ans = Ans * Power( G[ j ] * Power( G[ i - 1 ], Mod - 2 ) % Mod, ( n / i ) * ( m / i ) % Mod ) % Mod;
}
printf( "%lld\n", Ans );
return;
} int main() {
Init();
int TestCases;
scanf( "%d", &TestCases );
for( ; TestCases--; ) Work();
return 0;
}

「SDOI2017」数字表格的更多相关文章

  1. loj2000 「SDOI2017」数字表格

    there #include <iostream> #include <cstring> #include <cstdio> using namespace std ...

  2. 「SDOI2017」树点涂色 解题报告

    「SDOI2017」树点涂色 我sb的不行了 其实一开始有一个类似动态dp的想法 每个点维护到lct树上到最浅点的颜色段数,然后维护一个\(mx_{0,1}\)也就是是否用虚儿子的最大颜色 用个set ...

  3. loj#2128. 「HAOI2015」数字串拆分 矩阵乘法

    目录 题目链接 题解 代码 题目链接 loj#2128. 「HAOI2015」数字串拆分 题解 \(f(s)\)对于\(f(i) = \sum_{j = i - m}^{i - 1}f(j)\) 这个 ...

  4. LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配

    #2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  5. AC日记——「SDOI2017」序列计数 LibreOJ 2002

    「SDOI2017」序列计数 思路: 矩阵快速幂: 代码: #include <bits/stdc++.h> using namespace std; #define mod 201704 ...

  6. 「SDOI2016」数字配对

    「SDOI2016」数字配对 题目大意 传送门 题解 \(a_i\) 是 \(a_j\) 的倍数,且 \(\frac{a_i}{a_j}\) 是一个质数,则将 \(a_i,a_j\) 质因数分解后,其 ...

  7. 【BZOJ4816】【SDOI2017】数字表格 [莫比乌斯反演]

    数字表格 Time Limit: 50 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Doris刚刚学习了fibonac ...

  8. 【LOJ】#2128. 「HAOI2015」数字串拆分

    题解 题中给的函数可以用矩阵快速幂递推 我们记一个数组dp[i](这个数组每个元素是一个矩阵)表示从1到i所有的数字经过拆分矩阵递推的加和 转移方法是 \(dp[i] = \sum_{j = 0}^{ ...

  9. LOJ2269. 「SDOI2017」切树游戏 [FWT,动态DP]

    LOJ 思路 显然是要DP的.设\(dp_{u,i}\)表示\(u\)子树内一个包含\(u\)的连通块异或出\(i\)的方案数,发现转移可以用FWT优化,写成生成函数就是这样的: \[ dp_{u}= ...

随机推荐

  1. 18-Perl 错误处理

    1.Perl 错误处理程序运行过程中,总会碰到各式各样的错误,比如打开一个不存在的文件.程序运行过程中如果出现错误就会停止,我们就需要使用一些检测方法来避免错误,从而防止程序退出.Perl 提供了多中 ...

  2. oracle创建用户表空间

    --本次因工作需要,为其他部门提供部分表数据,创建一个新用户与表空间.--system用户下drop user sys_outside cascade;drop tablespace sys_outs ...

  3. Linux Permission denied 问题

    Linux Permission denied 问题 来源  https://www.cnblogs.com/sparkdev/p/10287164.html 如果当前用户没有某个文件的写权限,又要通 ...

  4. winfrom---Window 消息大全

    最近正在捣腾winfrom,遇到了关于window消息这一块的东西,正好在网上看到“微wx笑”的总结. 原文地址:http://blog.csdn.net/testcs_dn/article/deta ...

  5. 对MySQL索引、锁及事务的简单分析

    一.索引的数据结构 1.二叉搜索树实现的索引 二叉搜索树如下图,它查找元素的时间复杂度为O(logn) 但如果经常出现增删操作,最后导致二叉搜索树变成线性的二叉树,这样它查找元素的时间复杂度就会变成O ...

  6. 1.Linux文件及目录结构

    Linux 文件结构 在Linux中 ,一切皆文件 目录结构

  7. mysql计算QPS

    首先连接上mysql: $ mysql -h .x -P3306 -uusername -p123456 进入Mysql之后,查询general_log: mysql> SHOW VARIABL ...

  8. 【异常】Phoenix异常:java.lang.ArithmeticException: Rounding necessary

    1 异常sql upsert into WMBIGDATA.ODS_ES_CHARGING_STATION(id,evcosType,address,serviceTel,supportOrder,o ...

  9. 5、vim编辑器

    1.什么是VIM? 理解为windows下面的文本编辑器,比如记事本,比如word文档 2.为什么要学? 因为在后面我们配置的服务,都需要人为修改配置,以便让程序按照我们修改后的指示运行. 1.修改配 ...

  10. C#在Oralce环境执行查询时报"Arithmetic operation resulted in an overflow"

    问题描述:C#代码在Oralce环境执行分组求和的Sql时报错,提示“Arithmetic operation resulted in an overflow”,即算术运算导致溢出 (1).执行Sql ...