【BZOJ4816】【SDOI2017】数字表格 [莫比乌斯反演]
数字表格
Time Limit: 50 Sec Memory Limit: 128 MB
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
2 3
4 5
6 7
Sample Output
6
960
HINT
Solution
运用莫比乌斯反演,得到式子:
这样我们对于内外分块即可,复杂度为O(n^(0.75)*T)。
然后我们会发现在BZOJ上过不去,怎么办呢?卡常!BearChild运用了如下的卡常技巧:
1. 读入优化; 2. O(n)预处理逆元; 3. 内嵌汇编实现乘和取模; 4. 记录n/i,避免多次除法。
Code
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long s64; const int ONE = 1e6+;
const int MOD = 1e9+;
const int PHI = 1e9+; int T;
int n,m;
int prime[ONE],p_num,miu[ONE];
int F[ONE];
bool isp[ONE];
s64 Ans; int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} int Quickpow(int a,int b)
{
int res = ;
while(b)
{
if(b&) res = (s64)res*a%MOD;
a = (s64)a*a%MOD;
b>>=;
}
return res;
} void Deal_first(int MaxN)
{
F[]=;
F[]=; for(int i=; i<=MaxN; i++) F[i] = ((s64)F[i-]+F[i-]) % MOD;
F[]=; for(int i=; i<=MaxN; i++) F[i] = (s64)F[i]*F[i-] % MOD; miu[] = ;
for(int i=; i<=MaxN; i++)
{
if(!isp[i])
prime[++p_num] = i, miu[i] = -;
for(int j=; j<=p_num, i*prime[j]<=MaxN; j++)
{
isp[i * prime[j]] = ;
if(i % prime[j] == )
{
miu[i * prime[j]] = ;
break;
}
miu[i * prime[j]] = -miu[i];
}
miu[i] += miu[i-];
}
} int f(int n,int m)
{
if(n > m) swap(n,m);
s64 Ans = ;
for(int i=,j=; i<=n; i=j+)
{
j = min(n/(n/i), m/(m/i));
Ans += (s64)(n/i) * (m/i)%PHI * ((s64)(miu[j] - miu[i-] + PHI)%PHI) % PHI;
Ans %= PHI;
}
return Ans;
} void Solve()
{
n=get(); m=get();
if(n > m) swap(n,m);
Ans = ;
for(int i=,j=; i<=n; i=j+)
{
j = min(n/(n/i), m/(m/i));
Ans = Ans * Quickpow( (s64)F[j] * Quickpow(F[i-],MOD-) % MOD , f(n/i,m/i) % PHI) % MOD;
}
printf("%lld\n",Ans);
} int main()
{
Deal_first(ONE-);
T = get();
while(T--)
Solve();
return ;
}
非卡常版
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long s64; const int ONE = 1e6+;
const int MOD = 1e9+;
const int PHI = 1e9+; int T;
int n,m;
int prime[ONE],p_num,miu[ONE];
int Niyu[ONE];
int F[ONE];
bool isp[ONE];
int Ans; inline int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} inline int modmul(const int &a, const int &b,const int &M)
{
int ret;
__asm__ __volatile__("\tmull %%ebx\n\tdivl %%ecx\n" : "=d"(ret) : "a"(a), "b"(b), "c"(M));
return ret;
} inline int Quickpow(int a,int b)
{
int res = ;
while(b)
{
if(b&) res = modmul(res,a,MOD);
a = modmul(a,a,MOD);
b>>=;
}
return res;
} inline void Deal_first(int MaxN)
{
F[]=; F[]=;
int val=;
for(int i=; i<=MaxN; i++)
{
F[i] = F[i-]+F[i-];
if(F[i] >= MOD) F[i] -= MOD;
val = modmul(val,F[i],MOD);
}
Niyu[MaxN] = Quickpow(val, MOD-);
for(int i=MaxN-;i>=;i--) Niyu[i] = modmul(Niyu[i+],F[i+],MOD);
Niyu[] = Niyu[]; F[]=;
for(int i=; i<=MaxN; i++) F[i] = modmul(F[i],F[i-],MOD); miu[] = ;
for(int i=; i<=MaxN; i++)
{
if(!isp[i])
prime[++p_num] = i, miu[i] = -;
for(int j=; j<=p_num, i*prime[j]<=MaxN; j++)
{
isp[i * prime[j]] = ;
if(i % prime[j] == )
{
miu[i * prime[j]] = ;
break;
}
miu[i * prime[j]] = -miu[i];
}
miu[i] += miu[i-];
}
} inline int f(int n,int m)
{
if(n > m) swap(n,m);
int Ans = ;
for(int i=,j=; i<=n; i=j+)
{
int x=n/i, y=m/i;
j = min(n/x, m/y);
Ans = ((s64)Ans + modmul(modmul(x,y,PHI) , ((s64)miu[j] - miu[i-] + PHI), PHI) )%PHI;
}
return Ans;
} inline void Solve()
{
n=get(); m=get();
if(n > m) swap(n,m);
Ans = ;
for(int i=,j=; i<=n; i=j+)
{
int x=n/i, y=m/i;
j = min(n/x, m/y);
Ans = (s64)modmul(Ans , Quickpow( modmul(F[j],Niyu[i-],MOD) , f(x,y)), MOD);
}
printf("%d\n",Ans);
} int main()
{
Deal_first(ONE-);
T = get();
while(T--)
Solve();
return ;
}
卡常版
【BZOJ4816】【SDOI2017】数字表格 [莫比乌斯反演]的更多相关文章
- BZOJ4816 SDOI2017 数字表格 莫比乌斯反演
传送门 做莫比乌斯反演题显著提高了我的\(\LaTeX\)水平 推式子(默认\(N \leq M\),分数下取整,会省略大部分过程) \(\begin{align*} \prod\limits_{i= ...
- [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]数字表格 (反演+逆元)
(真不想做莫比乌斯了) 首先根据题意写出式子 ∏(i=1~n)∏(j=1~m)f[gcd(i,j)] 很明显的f可以预处理出来,解决 根据套路分析,我们可以先枚举gcd(i,j)==d ∏(d=1~n ...
- 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)}\),多组询问, ...
- [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 ...
随机推荐
- lintcode-181-将整数A转换为B
181-将整数A转换为B 如果要将整数A转换为B,需要改变多少个bit位? 注意事项 Both n and m are 32-bit integers. 样例 如把31转换为14,需要改变2个bit位 ...
- iOS- 多线程技术的概述及优点
1.概述 在iOS开发中: •耗时操作,例如网络图片.视频.歌曲.书籍等资源下载 •游戏中的声音播放 我们可以利用多线程: •充分发挥多核处理器的优势,并发(同时执行)执行任务让系统运行的更快.更 ...
- error LNK2019: 无法解析的外部符号 该符号在函数 中被引用 解决方案
需要添加lib或者dll库.项目-属性-配置属性-链接器-输入-附件依赖项,添加需要的lib. 例如我在运行OSG程序的时候,忘记添加了附件依赖项就会报这个错. 解决方案如图.
- JSP传递数组给JS的方法
由于JSP页面的数组无法直接传到JS.所以采用以下方法来获取数组. <% String[] title = { "姓名 ", "学号 ", "性 ...
- Python ZKPython 安装
1.由于python客户端依赖c的客户端所以要先安装c版本的客户端cd zookeeper-3.4.5/src/c./configuremake make install 2.下载python扩展包, ...
- SPDY以及HTTP2.0
背景介绍 HTTP2.0跟SPDY在不少理念上是相似的,目的都是为了提升HTTP1.1的性能. HTTP2.0将会是业界的标准,比SPDY要完善,今后可能会都转向http2.0而放弃SPDY. SPD ...
- [C/C++] const用法详解
const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修饰局部变量.例:void fun ...
- UIKit中的几个核心对象的介绍:UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍
UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...
- BZOJ3197:[SDOI2013]刺客信条——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3197 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受 ...
- BZOJ 1010: [HNOI2008]玩具装箱toy | 单调队列优化DP
原题: http://www.lydsy.com/JudgeOnline/problem.php?id=1010 题解: #include<cstdio> #include<algo ...