P3704 [SDOI2017]数字表格 (莫比乌斯反演)
[题目链接] https://www.luogu.org/problemnew/show/P3704
[题解] https://www.luogu.org/blog/cjyyb/solution-p3704
题目描述
Doris刚刚学习了fibonacci数列。用\(f[i]\)表示数列的第\(i\)项,那么
\(f[0]=0,f[1]=1,\)
\(f[n]=f[n-1]+f[n-2],n\geq 2\)
Doris用老师的超级计算机生成了一个\(n×m\)的表格,
第\(i\)行第\(j\)列的格子中的数是\(f[\gcd(i,j)]\)
Doris的表格中共有\(n×m\)个数,她想知道这些数的乘积是多少。
答案对\(10^9+7\)取模。
/*
-----------------------
https://www.luogu.org/blog/cjyyb/solution-p3704
-----------------------
常规套路化式子,一定要看清题...
枚举两个数d和x转化后还是枚举两个数T(=dx)和d
预处理的初始化,一定要注意
最后预处理O(NlogN),每个询问O(√N),O(√N)级别的询问
-----------------------2019.2.15
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
}
const int MAXN=1e6+5;
const int mod=1e9+7;
LL mul[MAXN],f[MAXN],invf[MAXN];
LL ans,tmp;
int mu[MAXN],prime[MAXN];
bool vis[MAXN];
int T,n,m;
inline int qpow(int a,int b){// a要开long long !!!
LL res=1;
while(b){
if(b&1) (res*=a)%=mod;
(a*=a)%=mod;
b>>=1;
}
return res;
}
inline void init(int n){
mu[1]=1;
f[1]=invf[1]=1;///
mul[0]=mul[1]=1;///
for(int i=2;i<=n;i++){
f[i]=(f[i-1]+f[i-2])%mod;
invf[i]=qpow(f[i],mod-2);
mul[i]=1;///
if(!vis[i]) prime[++prime[0]]=i,mu[i]=-1;
for(int j=1;j<=prime[0]&&i*prime[j]<=n;j++){
vis[i*prime[j]]=true;
if(i%prime[j]==0) break;///经常错这里
mu[i*prime[j]]=-mu[i];
}
}
for(int i=1;i<=n;i++){
if(mu[i]==0) continue;
for(int j=i;j<=n;j+=i)
(mul[j]*=(mu[i]==1)?f[j/i]:invf[j/i])%=mod;//"暴力"计算
}
for(int i=2;i<=n;i++)
(mul[i]*=mul[i-1])%=mod;
}
signed main(){
T=read();
init(1e6);
while(T--){
n=read(),m=read();
if(n>m) swap(n,m);
ans=1;
for(int l=1,r;l<=n;l=r+1){
r=min(n/(n/l),m/(m/l));
tmp=mul[r]*qpow(mul[l-1],mod-2)%mod;
(ans*=qpow(tmp,(n/l)*(m/l)%(mod-1)))%=mod;
}
printf("%lld\n",ans);
}
}
P3704 [SDOI2017]数字表格 (莫比乌斯反演)的更多相关文章
- [Sdoi2017]数字表格 [莫比乌斯反演]
[Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...
- 【bzoj4816】[Sdoi2017]数字表格 莫比乌斯反演
题目描述 Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生 ...
- BZOJ4816 SDOI2017 数字表格 莫比乌斯反演
传送门 做莫比乌斯反演题显著提高了我的\(\LaTeX\)水平 推式子(默认\(N \leq M\),分数下取整,会省略大部分过程) \(\begin{align*} \prod\limits_{i= ...
- BZOJ.4816.[SDOI2017]数字表格(莫比乌斯反演)
题目链接 总感觉博客园的\(Markdown\)很..\(gouzhi\),可以看这的. 这个好像简单些啊,只要不犯sb错误 [Update] 真的算反演中比较裸的题了... \(Descriptio ...
- BZOJ 4816 [Sdoi2017]数字表格 ——莫比乌斯反演
大力反演出奇迹. 然后xjb维护. 毕竟T1 #include <map> #include <ctime> #include <cmath> #include & ...
- luogu3704 [SDOI2017]数字表格(莫比乌斯反演)
link 设\(f_0=0,f_1=1,f_n=f_{n-1}+f_{n-2}(n\ge 2)\) 求\(\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)}\),多组询问, ...
- P3704 [SDOI2017]数字表格
P3704 [SDOI2017]数字表格 链接 分析: $\ \ \ \prod\limits_{i = 1}^{n} \prod\limits_{j = 1}^{m} f[gcd(i, j)]$ $ ...
- [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)
[BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...
- [SDOI2017]数字表格 --- 套路反演
[SDOI2017]数字表格 由于使用markdown的关系 我无法很好的掌控格式,见谅 对于这么简单的一道题竟然能在洛谷混到黑,我感到无语 \[\begin{align*} \prod\limits ...
- 【BZOJ4816】【SDOI2017】数字表格 [莫比乌斯反演]
数字表格 Time Limit: 50 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Doris刚刚学习了fibonac ...
随机推荐
- Linux开机启动详解
Linux开机启动程序详解 我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤 ...
- rsa 数学推论
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化 而生动的描述,使得高深的数学理论能够被容易地理解.我们 ...
- solr第二天 京东案例 课程文档 有用
全文检索技术 Lucene&Solr Part3 1. 课程计划 1. Solr配置中文分析器 a) Schema.xml的配置 b) 配置IKAnalyzer ...
- getopt两个模块getopt 和gun_getopt 的异同
getopt的两个模块getopt和gun_getopt都可以接收参数,但是又有不同; 先看 getopt.getopt这个模块: import sys import getopt def main( ...
- Part5核心初始化_lesson4---关闭mmu
1.ARM存储体系 2.cache 3.虚拟地址 那么谁来完成把虚拟地址转换成物理地址呢? 4.这个工作就由MMU来转换!! 5.关闭MMU和cache 他们都是通过cp15协处理器来控制的!应该在A ...
- C/C++预处理指令常见的预处理指令
C/C++预处理指令常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下面代码 #ifd ...
- Java 享元设计
- Form1调用Unit2类中函数
Form1有一个button,当Form1.Create时触发Button的OnClick事件,OnClick事件调用Unit2单元中的函数: unit Unit2; interface uses F ...
- java8之流的基本使用(二)
概述 流(stream())是java8的一个新特性,主要的作用就是将各种类型的集合转换为流,然后的方便迭代数据用的.例如: //将List类型的集合转换为流 list.stream() 转换为流之后 ...
- Android 画个电池出来(Paint和canvas)
1.Android中很多时候都要自己去画一个自定义控件出来,就需要用到Paint和Canvas这两个类. 2.效果图: