洛谷很早以前就写过了,今天交到bzoj发现TLE了。

检查了一下发现自己复杂度是错的。

题目传送门:洛谷P3704

题意简述:

求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F_{\gcd(i,j)}\bmod mod\) ,其中 \(F_{i}\) 是斐波那契数列的第 \(i\) 项, \(mod=10^9+7\) 。

\(T\) 组数据。

题解:

喜闻乐见的推式子时间。

不失一般性,假设 \(N\le M\) 。

\[\begin{aligned}&\prod_{i=1}^{N}\prod_{j=1}^{M}F_{\gcd(i,j)} \\=&\prod_{k=1}^{N}{F_{k}}^{\left(\sum_{i=1}^{N}\;\sum_{j=1}^{M}\;\left[\gcd(i,j)=k\right]\right)}\end{aligned}\]

右上角的指数部分是老套路了。

\[\begin{align*}&= \sum_{i=1}^{N}\sum_{j=1}^{M}\left[\gcd(i,j)=k\right]\\&= \sum_{i=1}^{\left\lfloor\frac{N}{k}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{M}{k}\right\rfloor}\left[\gcd(i,j)=1\right]\\&= \sum_{d=1}^{\left\lfloor\frac{N}{k}\right\rfloor}\mu(d)\left\lfloor\frac{N}{kd}\right\rfloor\left\lfloor\frac{M}{kd}\right\rfloor\end{align*}\]

所以

\[\begin{align*} &= \prod_{k=1}^{N}{F_{k}}^{\left(\sum_{d=1}^{\left\lfloor\frac{N}{k}\right\rfloor}\mu(d)\left\lfloor\frac{N}{kd}\right\rfloor\left\lfloor\frac{M}{kd}\right\rfloor\right)}\\ &= \prod_{T=1}^{N}\left(\prod_{k|T}{F_{k}}^{\mu(\frac{T}{k})}\right)^{\left\lfloor\frac{N}{T}\right\rfloor\left\lfloor\frac{M}{T}\right\rfloor} \end{align*}\]

令 \(f(n)=\prod_{d|n}{F_{d}}^{\mu(\frac{n}{d})}\) 。

\[=\prod_{T=1}^{N}{f(T)}^{\left\lfloor\frac{N}{T}\right\rfloor\left\lfloor\frac{M}{T}\right\rfloor}\]

外层数论分块求出。内层的 \(f(T)\) 直接暴力预处理,每个数直接乘到它的倍数中,复杂度 \(\Theta(n\log n)\)。

注意实现的时候的时间复杂度,我因为实现多了快速幂的一个 \(\log\) 被卡了。

正确的时间复杂度应该是 \(\Theta(N(\log N+\log mod)+T\sqrt{N}\log mod)\) 。

 #include<cstdio>
#include<algorithm>
using namespace std; #define mod 1000000007
#define LL long long int Pow(int b, LL e) {
if (e < ) e += mod - ;
int a = ;
for (; e; b = (LL)b * b % mod, e >>= )
if (e & ) a = (LL)a * b % mod;
return a;
} bool ip[];
int p[], pc;
int mu[];
int f[], fr[]; void init() { ip[] = ;
mu[] = ; for (int i = ; i <= ; ++i) {
if (!ip[i]) {
p[++pc] = i;
mu[i] = -;
}
for (int j = ; j <= pc && (LL)p[j] * i <= ; ++j) {
register int k = p[j] * i;
ip[k] = ;
if (i % p[j]) mu[k] = -mu[i];
else break;
}
} for (int i = ; i <= ; ++i)
f[i] = , fr[i] = ; int A = , B = ;
for (int i = ; i <= ; ++i) {
B = (A + B) % mod;
A = (B - A + mod) % mod;
int G[] = {Pow(B, -), , B};
for (int j = i, k = ; j <= ; j += i, ++k) {
f[j] = (LL)f[j] * G[mu[k] + ] % mod,
fr[j] = (LL)fr[j] * G[ - mu[k]] % mod;
}
} f[] = fr[] = ;
for (int i = ; i <= ; ++i)
f[i] = (LL)f[i - ] * f[i] % mod,
fr[i] = (LL)fr[i - ] * fr[i] % mod;
} int main() {
init();
int T;
scanf("%d", &T);
while (T--) {
int N, M;
scanf("%d%d", &N, &M);
if (N > M) swap(N, M);
int A = ;
for (int i = , j; i <= N; i = j + ) {
j = min(N / (N / i), M / (M / i));
A = (LL)A * Pow((LL)f[j] * fr[i - ] % mod, (LL)(N / i) * (M / i)) % mod;
}
printf("%d\n", A);
}
return ;
}

bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格的更多相关文章

  1. 洛谷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 ...

  2. 洛谷 P3704 [SDOI2017]数字表格(莫比乌斯函数)

    题面传送门 题意: 求 \[\prod\limits_{i=1}^n\prod\limits_{j=1}^mfib_{\gcd(i,j)} \] \(T\) 组测试数据,\(1 \leq T \leq ...

  3. 洛谷P3704 [SDOI2017]数字表格(莫比乌斯反演)

    传送门 yyb大佬太强啦…… 感觉还是有一点地方没有搞懂orz //minamoto #include<cstdio> #include<iostream> #include& ...

  4. 洛谷 P3704 SDOI2017 数字表格

    题意: 给定两个整数 \(n, m\),求: \[\prod_{i = 1} ^ n \prod_{j = 1} ^ m \operatorname{Fib}_{\gcd\left(n, m\righ ...

  5. 洛谷3704 [SDOI2017] 数字表格 【莫比乌斯反演】

    题目分析: 比较有意思,但是套路的数学题. 题目要求$ \prod_{i=1}^{n} \prod_{j=1}^{m}Fib(gcd(i,j)) $. 注意到$ gcd(i,j) $有大量重复,采用莫 ...

  6. 洛咕 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]}\) ...

  7. P3704 [SDOI2017]数字表格

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

  8. P3704 [SDOI2017]数字表格 (莫比乌斯反演)

    [题目链接] https://www.luogu.org/problemnew/show/P3704 [题解] https://www.luogu.org/blog/cjyyb/solution-p3 ...

  9. luogu P3704 [SDOI2017]数字表格

    传送门 我是真的弱,推式子只能推一半 下面假设\(n<m\) 考虑题目要求的东西,可以考虑每个gcd的贡献,即\[\prod_{d=1}^{n}f[d]^{\sum_{i=1}^{\lfloor ...

随机推荐

  1. google 浏览器插件安装

    谷歌访问助手

  2. Vue使用SCSS进行模块化开发

    原文地址:http://www.cnblogs.com/JimmyBright/p/7761531.html 个人认为scss最大的好处就是能将css属性设置为变量,这样让css一键更换主题成为可能. ...

  3. 【ARC083E】Bichrome Tree

    Description ​ 给一棵\(n\)个节点的树,和一个长度同样为\(n\)的非负整数序列\(x_i\). ​ 请尝试对每个节点染黑或白两种颜色,并确定一个非负整数权值. ​ 问是否存在一种方案 ...

  4. 【uoj219】 NOI2016—优秀的拆分

    http://uoj.ac/problem/219 (题目链接) 题意 一个字符串求它有多少个形如AABB的子串. Solution 其实跟后缀数组里面一个论文题poj3693处理方式差不多吧. 先处 ...

  5. LINUX内核分析第七周——可执行程序的装载

    一.得到一个可执行程序 1. 预处理.编译.链接 gcc hello.c -o hello.exe gcc编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤. 预处理 => ...

  6. redis协议

    Redis的通讯协议可以说大集汇了……消息头标识,消息行还有就行里可能还有个数据块大小描述.首先Redis是以行来划分,每行以\r\n行结束.每一行都有一个消息头,消息头共分为5种分别如下: (+) ...

  7. 轻量高效的开源JavaScript插件和库 【转】

    图片 布局 轮播图 弹出层 音频视频 编辑器 字符串 表单 存储 动画 时间 其它 加载器 构建工具 测试 包管理器 CDN 图片 baguetteBox.js - 是一个简单易用的响应式图像灯箱效果 ...

  8. 【纪中集训2019.3.12】Mas的仙人掌

    题意: ​ 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...

  9. nodejs调用脚本(python/shell)和系统命令

    每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者文件,文档见http://nodejs.org/api/ch ...

  10. CSS之float样式

    一.简介 Css样式的float浮动属性,用于设置标签对象(如:<div>标签盒子.<span>标签.<a>标签.<em>标签等html标签)的浮动布局 ...