首先要求每个数互不相等,故有$x\perp y$。

可以发现$\frac{x}{y}$在$k$进制下为纯循环小数的充要条件为$x\cdot k^{len}\equiv x(mod\ y)$,即$y\perp k$。

接下来进行经典的推导:
$$\begin{aligned}&\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[i\perp j][j\perp k]\\=&\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\sum_{d|i,d|j}\mu(d)[j\perp k]\\=&\sum\limits_{d=1}^{min(n,m)}\mu(d)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}[jd\perp k]\\=&\sum\limits_{d=1}^{min(n,m)}\mu(d)\lfloor\frac{n}{d}\rfloor\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}[j\perp k][d\perp k]\end{aligned}$$

令$f(n)=\sum\limits_{i=1}^{n}[i\perp k]$,由于$gcd(i,k)=gcd(i-k,k)$,故$f(n)=\lfloor\frac{n}{k}\rfloor\cdot f(k)+f(n\%k)$

再令$g(i)=\mu(i)[i\perp k]$,则答案为$\sum\limits_{d=1}^{min(n,m)}g(d)f(\lfloor\frac{m}{d}\rfloor)\lfloor\frac{n}{d}\rfloor$

令$G(n,k)$为$g()$的前缀和,同样进行根号优化:
$$G(n,k)=\sum\limits_{i=1}^{n}\mu(i)[i\perp k]=\sum\limits_{i=1}^{n}\mu(i)\sum\limits_{d|i,d|k}\mu(d)=\sum\limits_{d|k}\mu(d)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(id)$$
注意到$\mu(id)=[i\perp d]\ ?\ 0:\mu(i)\cdot \mu(d)$,故
$$G(n,k)=\sum\limits_{d|k}\mu^2(d)\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(i)[i\perp d]=\sum\limits_{d|k}\mu^2(d)G(\lfloor\frac{n}{d}\rfloor,d)$$

$G$函数可以通过递归记忆化求出。由于$G(a,b)$中$a$最多有$\sqrt{n}$种取值,$b$最多有$\sigma_0(k)$种取值,每次转移的复杂度也是$\sigma_0(k)$的,故总复杂度为$O(n^{\frac{2}{3}}+\sigma_0^2(k))$,事实上远远达不到这个上界。

在做除$\mu$和$\varphi$之外的杜教筛时,用map会简洁得多,有时候(可能询问到的n不能确定时)必须用map。

此题还有一种更优类似洲阁筛的做法,能处理$k\leqslant 10^{18}$的问题,复杂度为$O(n^{\frac{2}{3}}+\omega(k)\sqrt{n})$。

https://blog.sengxian.com/solutions/bzoj-4652

 #include<map>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=,K=;
ll ans;
bool b[N];
int tot,w,n,m,k,F[K],p[N],miu[N];
map<int,int>G[K],Miu; int gcd(int a,int b){ return b ? gcd(b,a%b) : a; }
int f(int n){ return (n/k)*F[k]+F[n%k]; } void pre(int n){
miu[]=;
rep(i,,n){
if (!b[i]) p[++tot]=i,miu[i]=-;
for (int j=; j<=tot && i*p[j]<=n; j++){
b[i*p[j]]=;
if (i%p[j]==) { miu[i*p[j]]=; break; }
else miu[i*p[j]]=-miu[i];
}
}
rep(i,,n) miu[i]+=miu[i-];
} int Mu(int n){
int res=;
if (n<=w) return miu[n];
if (Miu.count(n)) return Miu[n];
for (int i=,lst; i<=n; i=lst+)
lst=n/(n/i),res-=Mu(n/i)*(lst-i+);
return Miu[n]=res;
} int g(int n,int k){
int res=;
if (!n) return ;
if (G[k].count(n)) return G[k][n];
if (k==) return Mu(n);
for (int d=; d*d<=k; d++)
if (k%d==){
if (miu[d]-miu[d-]) res+=g(n/d,d);
if (d*d==k) continue;
int t=k/d;
if (miu[t]-miu[t-]) res+=g(n/t,t);
}
return G[k][n]=res;
} int main(){
freopen("cycle.in","r",stdin);
freopen("cycle.out","w",stdout);
scanf("%d%d%d",&n,&m,&k); w=min(max(n,m),); pre(w);
rep(i,,k) F[i]=F[i-]+(gcd(i,k)==);
for (int i=,lst; i<=m && i<=n; i=lst+)
lst=min(n/(n/i),m/(m/i)),ans+=1ll*(g(lst,k)-g(i-,k))*f(m/i)*(n/i);
printf("%lld\n",ans);
return ;
}

[NOI2016]循环之美(杜教筛)的更多相关文章

  1. 【BZOJ4652】【NOI2016】循环之美(莫比乌斯反演,杜教筛)

    [BZOJ4652]循环之美(莫比乌斯反演,杜教筛) 题解 到底在求什么呢... 首先不管他\(K\)进制的问题啦,真是烦死啦 所以,相当于有一个分数\(\frac{i}{j}\) 因为值要不相等 所 ...

  2. BZOJ4652 [Noi2016]循环之美 【数论 + 莫比乌斯反演 + 杜教筛】

    题目链接 BZOJ 题解 orz 此题太优美了 我们令\(\frac{x}{y}\)为最简分数,则\(x \perp y\)即,\(gcd(x,y) = 1\) 先不管\(k\)进制,我们知道\(10 ...

  3. BZOJ4652 NOI2016循环之美(莫比乌斯反演+杜教筛)

    因为要求数值不同,不妨设gcd(x,y)=1.由提示可以知道,x/y是纯循环小数的充要条件是x·klen=x(mod y).因为x和y互质,两边同除x,得klen=1(mod y).那么当且仅当k和y ...

  4. UOJ#221. 【NOI2016】循环之美 数论,杜教筛

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ221.html 题解 首先把题目转化为求 \[\sum_{x=1}^n \sum_{y=1}^m [\gcd(x,y) = ...

  5. NOI 2016 循环之美 (莫比乌斯反演+杜教筛)

    题目大意:略 洛谷传送门 鉴于洛谷最近总崩,附上良心LOJ链接 任何形容词也不够赞美这一道神题 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M}[gcd(i,j) ...

  6. [基本操作] Mobius 反演, Dirichlet 卷积和杜教筛

    Dirichlet 卷积是两个定义域在正整数上的函数的如下运算,符号为 $*$ $(f * g)(n) = \sum_{d|n}f(d)g(\frac{n}{d})$ 如果不强调 $n$ 可简写为 $ ...

  7. [UOJ#221][BZOJ4652][Noi2016]循环之美

    [UOJ#221][BZOJ4652][Noi2016]循环之美 试题描述 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k 进制下,一个数的小数部 ...

  8. luogu 1587 [NOI2016]循环之美

    LINK:NOI2016循环之美 这道题是 给出n m k 求出\(1\leq i\leq n,1\leq j\leq m\) \(\frac{i}{j}\)在k进制下是一个纯循环的. 由于数值相同的 ...

  9. Min_25 筛与杜教筛

    杜教筛 \(\) 是 \(\) 的前缀和,\(\), \(\) 同理. 假设 \( × = ℎ\) ,并且 \(, \) 易求出,\(\) 难求出. 那么 \[H () = \sum_{ \cdot ...

随机推荐

  1. 【洛谷 P2761】 软件补丁问题(状态压缩,最短路)

    题目链接 第四题. 初看题目很懵,网络流这么厉害的吗,毫无头绪去看题解.. 所以这和网络流有什么关系呢? 把规则用二进制保存下来,然后跑最短路救星了. 在线跑,离线连边太慢了. (以后干脆不管什么题直 ...

  2. Bazinga(HDU5510+KMP)

    t题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510 题目: 题意:找到一个编号最大的字符串满足:存在一个编号比它小的字符串不是它的字串. 思路:K ...

  3. Optimal Milking(POJ2112+二分+Dinic)

    题目链接:http://poj.org/problem?id=2112 题目: 题意:有k台挤奶机,c头奶牛,每台挤奶机每天最多生产m的奶,给你每个物品到其他物品的距离(除了物品到自己本省的距离为0外 ...

  4. D题 hdu 1412 {A} + {B}

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1412 {A} + {B} Time Limit: 10000/5000 MS (Java/Others ...

  5. Edgware Feign hystrix-dashboard

    相关依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...

  6. quartz的简介

    1. 介绍  Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源的任务调度框架,是完全由java开发的一个开源的任务日程管理系统,“任务进度管理器”就是一个在预 ...

  7. C语言分割字符串函数strtok

    在编程过程中,有时需要对字符串进行分割.而有效使用这些字符串分隔函数将会给我们带来很多的便利. 下面我将在MSDN中学到的strtok函数做如下翻译. strtok :在一个字符串查找下一个符号 ch ...

  8. Python标准库笔记(2) — re模块

    re模块提供了一系列功能强大的正则表达式(regular expression)工具,它们允许你快速检查给定字符串是否与给定的模式匹配(match函数), 或者包含这个模式(search函数).正则表 ...

  9. 如何得知 kernel 或 android 已開機多久時間

    adb shell cat /proc/uptime 中的第一個數字, adb shell cat "/proc/uptime" 210.79 312.76 或者是 kernel ...

  10. Linux内核死锁检测机制【转】

    转自:http://www.oenhan.com/kernel-deadlock-check 死锁就是多个进程(线程)因为等待别的进程已占有的自己所需要的资源而陷入阻塞的一种状态,死锁状态一旦形成,进 ...