「SDOI2017」数字表格
问题分析
\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」数字表格的更多相关文章
- loj2000 「SDOI2017」数字表格
there #include <iostream> #include <cstring> #include <cstdio> using namespace std ...
- 「SDOI2017」树点涂色 解题报告
「SDOI2017」树点涂色 我sb的不行了 其实一开始有一个类似动态dp的想法 每个点维护到lct树上到最浅点的颜色段数,然后维护一个\(mx_{0,1}\)也就是是否用虚儿子的最大颜色 用个set ...
- loj#2128. 「HAOI2015」数字串拆分 矩阵乘法
目录 题目链接 题解 代码 题目链接 loj#2128. 「HAOI2015」数字串拆分 题解 \(f(s)\)对于\(f(i) = \sum_{j = i - m}^{i - 1}f(j)\) 这个 ...
- LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配
#2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- AC日记——「SDOI2017」序列计数 LibreOJ 2002
「SDOI2017」序列计数 思路: 矩阵快速幂: 代码: #include <bits/stdc++.h> using namespace std; #define mod 201704 ...
- 「SDOI2016」数字配对
「SDOI2016」数字配对 题目大意 传送门 题解 \(a_i\) 是 \(a_j\) 的倍数,且 \(\frac{a_i}{a_j}\) 是一个质数,则将 \(a_i,a_j\) 质因数分解后,其 ...
- 【BZOJ4816】【SDOI2017】数字表格 [莫比乌斯反演]
数字表格 Time Limit: 50 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Doris刚刚学习了fibonac ...
- 【LOJ】#2128. 「HAOI2015」数字串拆分
题解 题中给的函数可以用矩阵快速幂递推 我们记一个数组dp[i](这个数组每个元素是一个矩阵)表示从1到i所有的数字经过拆分矩阵递推的加和 转移方法是 \(dp[i] = \sum_{j = 0}^{ ...
- LOJ2269. 「SDOI2017」切树游戏 [FWT,动态DP]
LOJ 思路 显然是要DP的.设\(dp_{u,i}\)表示\(u\)子树内一个包含\(u\)的连通块异或出\(i\)的方案数,发现转移可以用FWT优化,写成生成函数就是这样的: \[ dp_{u}= ...
随机推荐
- Java lesson17 homework
package lesson17; /**1. 创建自定义类Triangle包含如下属性: 最小夹角 a(整型.单位度) 最大夹角 b(整型.单位度) 编写构造方法包含两个参数(夹角),并根据参数计算 ...
- json在线格式化校验
推荐个在线工具箱,json在线格式化转换编码,挺好用的 https://www.codejson.com/
- sequelize学习笔记
示例: const Sequelize = require('sequelize'); // 建立连接 const sequelize = new Sequelize('test', 'root', ...
- 一个简单的创建xml方式
, matnr LIKE mara-matnr , maktx LIKE makt-maktx , END OF itab_matnr . , class LIKE m_wwgha-class,&qu ...
- shell脚本视频学习2
一.函数 1.函数格式 2.函数传入参数 3.手动输入函数中的参数 4.函数返回值 成功返回0,失败返回1 5.输入一个目录,判断目录是否存在,如果不存在则给出提示,如果存在则提示输入要创建的文件名, ...
- yii2 response多次输出问题的查找
{ "IsSuccess": 1, "ErrMsg": "OK", "Data": { "IsSuccess& ...
- php生成器yield
上次说了php的生成器Iterator,这次说一下yield 迭代生成器 (迭代)生成器也是一个函数,不同的是这个函数的返回值是依次返回, 而不是只返回一个单独的值.或者,换句话说,生成器使你能更方便 ...
- java_day06_java高级特性
Advance Java Programming 第六章: java语言高级特性(part1) 1.static修饰符 1)static变量 在类中,使用static修饰的成员变量,就是静态变量,反之 ...
- PAT Basic 1092 最好吃的月饼 (20 分)
月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种. 若想评比出一种“最好吃”的月饼,那势必在吃货界引发一场腥风血雨…… 在这里我们用数字说话,给出全国各地各种月饼的销量,要求你从中找出 ...
- RabbitMQ各种交换机类型Exchange Types介绍
最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange.Fanout exchange.Topic exchange.Headers exchange. 一.Direct E ...