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 ...
随机推荐
- JavaScript中的slice函数
String.slice(start,end)returns a string containing a slice, or substring, of string. It does not mod ...
- 02-Centos7安装部署Mirrorgate
1.以Docker方式运行 MirrorGate服务器作为docker镜像提供,因此要运行它只需在终端中执行以下命令: 注意mongo镜像要使用3.6版本,其他版本会提示版本问题. #Spinup m ...
- java内存模型与volatile变量与Atomic的compareAndSet
java分主内存和工作内存, 主内存是线程共享的, 工作内存是每个线程独有的. java对主内存的操作是通过工作内存间接完成的: 先拷贝主内存变量值到工作内存, 在工作内存操作这个变量的副本, 完成后 ...
- 【强化学习】python 实现 saras 例一
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10146554.html 说明:将之前 q-learning 实现的例一,用 saras 重新 ...
- Scala学习(七)---包和引入
包和引入 摘要: 在本篇中,你将会了解到Scala中的包和引入语句是如何工作的.相比Java不论是包还是引入都更加符合常规,也更灵活一些.本篇的要点包括: 1. 包也可以像内部类那样嵌套 2. 包路径 ...
- 面试2——java基础2
11.MVC设计模型 mvc设计模型是一种使用model-view-controller(模型-视图-控制器)设计创建web应用程序的模式.是一种开发模式,好处是可以将界面和业务逻辑分离. model ...
- synchronized和Lock的异同
JAVA语言使用两种机制来实现堆某种共享资源的同步,synchronized和Lock.其中,synchronized使用Object对象本身的notify.wait.notifyAll调度机制,而l ...
- (代码篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝
上一篇讲解了基础文件IO的理论发展,这里结合java看看各项理论的具体实现. 传统IO-intsmaze 传统文件IO操作的基础代码如下: FileInputStream in = new FileI ...
- ActiveMQ 填坑记
前言 MQ是现在大型系统架构中必不可少的一个重要中间件,之前有偏文章<MQ(消息队列)常见的应用场景解析>介绍过MQ的应用场景,现在流行的几个MQ是rabbitmq,rocketma,ka ...
- 并行管理工具——pdsh
1. pdsh安装2. pdsh常规使用2.1 pdsh2.2 pdcp 并行管理的方式有很多种: 命令行 一般是for循环 脚本 一般是expect+ssh等自编辑脚本 工具 pssh,pdsh,m ...