BZOJ4652 NOI2016循环之美(莫比乌斯反演+杜教筛)
因为要求数值不同,不妨设gcd(x,y)=1。由提示可以知道,x/y是纯循环小数的充要条件是x·klen=x(mod y)。因为x和y互质,两边同除x,得klen=1(mod y)。那么当且仅当k和y互质,存在len使该式成立。
于是现在要求的就是
k是固定的,先不管后面一部分。套路地化式子:
设f(i)=[i⊥k]。注意到k很小,并且显然有gcd(j,k)=gcd(j%k,k)。于是O(k)的预处理出f的前缀和。
那么几乎已经做到线性了,能拿到84分,感觉非常棒。
然而要A掉还需要低于线性的做法。看到两个下取整就会特别想整除分块。那么现在我们需要求的是g(i)=μ(i)*[i⊥k]的前缀和。
继续套路地化:
注意到若i和d不互质,则μ(id)=0,否则μ(i)·μ(d)=μ(id)。
可以发现后面一个求和和我们的g函数形式上是一样的。于是可以递归求解,记忆化一下。边界k=1时用杜教筛求出μ的前缀和。
考虑复杂度。上面式子中的n有√N种(⌊N/d⌋的取值个数),k有√K种(K的因子个数)。转移时枚举因子√K种。把μ筛到2e7的话,杜教筛的次数非常少。于是总复杂度约为O(k√n+n2/3),且远远跑不满。
以上复杂度分析均为口胡。总之O(能过)。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 20000010
#define K 2010
int n,m,k,mobius[N],prime[N],sum[K],cnt=;
long long ans=;
bool flag[N];
map<int,int> miu;
map<int,int> G[K];
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
inline int f(int n){return sum[k]*(n/k)+sum[n%k];}
int calc(int k)
{
if (k<=min(min(n,m),N-)) return mobius[k];
if (miu[k]) return miu[k];
int s=;
for (int i=;i<=k;i++)
{
int t=k/(k/i);
s-=(t-i+)*calc(k/i);
i=t;
}
miu[k]=s;
return s;
}
int g(int n,int k)
{
if (n==) return ;
if (G[k][n]) return G[k][n];
if (k==) return calc(n);
int s=;
for (int i=;i*i<=k;i++)
if (k%i==)
{
if (mobius[i]-mobius[i-]) s+=g(n/i,i);
if (i*i!=k&&(mobius[k/i]-mobius[k/i-])) s+=g(n/(k/i),k/i);
}
G[k][n]=s;
return s;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4652.in","r",stdin);
freopen("bzoj4652.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read(),k=read();
flag[]=;mobius[]=;
for (int i=;i<=max(min(min(n,m),N-),k);i++)
{
if (!flag[i]) prime[++cnt]=i,mobius[i]=-;
for (int j=;j<=cnt&&prime[j]*i<=min(min(n,m),N-);j++)
{
flag[prime[j]*i]=;
if (i%prime[j]==) break;
else mobius[prime[j]*i]=-mobius[i];
}
}
for (int i=;i<=max(min(min(n,m),N-),k);i++) mobius[i]+=mobius[i-];
for (int i=;i<=k;i++)
sum[i]=sum[i-]+(gcd(i,k)==);
for (int i=;i<=min(n,m);i++)
{
int t=min(n/(n/i),m/(m/i));
ans+=1ll*(n/i)*f(m/i)*(g(t,k)-g(i-,k));
i=t;
}
cout<<ans;
return ;
}
BZOJ4652 NOI2016循环之美(莫比乌斯反演+杜教筛)的更多相关文章
- NOI 2016 循环之美 (莫比乌斯反演+杜教筛)
题目大意:略 洛谷传送门 鉴于洛谷最近总崩,附上良心LOJ链接 任何形容词也不够赞美这一道神题 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M}[gcd(i,j) ...
- BZOJ4652: [Noi2016]循环之美(莫比乌斯反演,杜教筛)
Description 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k 进制下,一个数的小数部分是纯循环的,那么它就是美的.现在,牛牛想知道:对 ...
- [复习]莫比乌斯反演,杜教筛,min_25筛
[复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...
- 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛
题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
- BZOJ4652 [Noi2016]循环之美 【数论 + 莫比乌斯反演 + 杜教筛】
题目链接 BZOJ 题解 orz 此题太优美了 我们令\(\frac{x}{y}\)为最简分数,则\(x \perp y\)即,\(gcd(x,y) = 1\) 先不管\(k\)进制,我们知道\(10 ...
- 【CCPC-Wannafly Winter Camp Day3 (Div1) F】小清新数论(莫比乌斯反演+杜教筛)
点此看题面 大致题意: 让你求出\(\sum_{i=1}^n\sum_{j=1}^n\mu(gcd(i,j))\). 莫比乌斯反演 这种题目,一看就是莫比乌斯反演啊!(连莫比乌斯函数都有) 关于莫比乌 ...
- 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】
用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...
- [HDU 5608]Function(莫比乌斯反演 + 杜教筛)
题目描述 有N2−3N+2=∑d∣Nf(d)N^2-3N+2=\sum_{d|N} f(d)N2−3N+2=∑d∣Nf(d) 求∑i=1Nf(i)\sum_{i=1}^{N} f(i)∑i=1Nf ...
随机推荐
- async源码学习 - 全部源码
因为工作需要,可能我离前端走远了,偏node方向了.所以异步编程的需求很多,于是乎,不得不带着学习async了. 我有个习惯,用别人的东西之前,喜欢稍微搞明白点,so就带着看看其源码. github: ...
- three.js - 添加材质 灯光 阴影
看下运行效果: 源码解释: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- 关于TCP和MQTT之间的转换
现在物联网流行的就是MQTT 其实MQTT就是在TCP的基础上建立了一套协议 可以看这个,本来我自己想用Wireshark监听一下,不过百度一搜索一大把,我就不测试了 https://blog.csd ...
- VS2017上执行VS2013项目错误MSB802之解决方案
进行想把我编写的数字图像处理软件MagicHouse更新到最新的VS2017开发环境下,原来的开发环境是VS2013.但是用VS2017打开项目并编译时,系统报错误MSB802,如下图所示. 其实Vi ...
- C# 判断一个文本文件的编码格式(转载)
文件的字符集在Windows下有两种,一种是ANSI,一种Unicode.对于Unicode,Windows支持了它的三种编码方式,一种是小尾编码(Unicode),一种是大尾编码(BigEndian ...
- CF1101G (Zero XOR Subset)-less 线性基
传送门 既然每一次选择出来的都是一个子段,不难想到前缀和计算(然而我没有想到--) 设异或前缀和为\(x_i\),假设我们选出来的子段为\([1,i_1],(i_1,i_2],...,(i_{k-1} ...
- Ionic Android项目Splash设置
ionic项目中,在splashscreen消失后会出现零点几秒的白屏,再出现app页面. 1. 安装Cordova splash screen插件 ionic plugin add org.apac ...
- 程序员从技术开发到项目管理PM--思维转变
对以往所做项目的经验做下总结,作为项目经理首先要对项目负责,思维要做下转变,要从项目全局角度考虑问题: 从个人成就到团队成就. 无论是做管理还是做技术,成就导向意识是优秀员工的基本素质.只有具 ...
- centos6.5虚拟机安装后,没有iptables配置文件
openstack环境里安装centos6.5系统的虚拟机,安装好后,发现没有/etc/syscofig/iptables防火墙配置文件. 解决办法如下: [root@kvm-server005 ~] ...
- Individual P1: Summary
经过5个小时成功把simple mode写差不多了..orz 也是蛮拼的. 开始毫无头绪,本能地开始从度娘搜索‘c# 单词统计’= =看了两段代码也算是见过c#的人了.差不多花了我1小时的时间. 然后 ...