对于一个分数x/y(x和y互素),在k进制下为纯循环当且仅当y和k互素
证明:任意一个分数都可以写成0.abbbbbbbb的形式(不妨假设a尽量短),设a的位数为l1,b的位数为l2,那么原分数即$\frac {b-a}{(k^{l2}-1)*k^{l1}}$
必要性:当l1=0的时候分母与k互素,即纯循环推出了y与k互素
充分性:反证法,设存在使得$l1>0$且$k^{l1}|b-a$,那么必然有$k|b-a$,也就是b和a的最后一位相同,那么可以将a的最后一位与b的前l2-1位组成新的循环节,与a最短的假设不成立
考虑如何计算:$\sum_{1\le i\le m}[(i,k)==1]\sum_{1\le j \le n}[(i,j)==1]$
先对后半部分莫反并提到前面,即$\sum_{t=1}^{m}[(t,k)==1]*(n/t)*\mu(t)\sum_{i=1}^{m/t}[(i,k)==1]$
考虑对于最后一个式子,设$f(n)=\sum_{i=1}^{n}[(i,k)==1]$,可以用$f(i)=(i/k)*f(k)+f(i\ mod\ k)$来求(预处理前k个值)
对其数论分块,即$\sum_{m/t,n/t}f(m/t)*(n/t)\sum_{t=l}^{r}[(t,k)==1]*\mu(t)$
再令$g(n,k)=\sum_{i=1}^{n}[(i,k)==1]*\mu(i)$,考虑快速递推计算g
对于k的任意质因子p,设$k=p^{t}*q$(p和q互素),那么$[(i,k)==1]=[(i,q)==1]-[(i,q)==1]*[p|i]$
把这个代入原式,即$g(n,k)=g(n,q)-\sum_{i=1}^{n/p}[(i,q)==1]*\mu(ip)$
由于当i与p不互素时$\mu(ip)=0$,因此添加条件$(i,p)=1$,$原式=g(n,q)-\sum_{i=1}^{n/p}[(i,q)==1]*[(i,p)==1]*\mu(i)*\mu(p)$
对该式化简(提出$\mu(p)=-1$,i与q和p都互素等价于(i,qp)=1),最终就得到$g(n,k)=g(n,q)+g(n/p,k)$
考虑递归,由于第一维和第二维的取值都只有$\sqrt{n}$和$\sqrt{k}$种,存下来即可(第一维用hash),递归边界条件为:1.当$n=0$时结果为0;2.当$k=1$时结果为莫比乌斯函数的前缀和,杜教筛即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define ll long long
4 #define N 10000005
5 map<int,int>id;
6 map<int,int>sum;
7 int V,n,m,k,f[2005],a[11],vis[N],p[N],mu[N];
8 ll ans,g[N/10][11];
9 int gcd(int x,int y){
10 if (!y)return x;
11 return gcd(y,x%y);
12 }
13 void pre(){
14 mu[1]=1;
15 for(int i=2;i<N-4;i++){
16 if (!vis[i]){
17 p[++p[0]]=i;
18 mu[i]=-1;
19 }
20 for(int j=1;(j<=p[0])&&(i*p[j]<N-4);j++){
21 vis[i*p[j]]=1;
22 if (i%p[j]==0){
23 mu[i*p[j]]=0;
24 break;
25 }
26 mu[i*p[j]]=-mu[i];
27 }
28 }
29 for(int i=1;i<N-4;i++)mu[i]+=mu[i-1];
30 for(int i=1;i<=k;i++)f[i]=f[i-1]+(gcd(i,k)==1);
31 for(int i=1;i<=p[0];i++)
32 if (k%p[i]==0)a[++a[0]]=p[i];
33 }
34 int calc_f(int t){
35 return f[k]*(t/k)+f[t%k];
36 }
37 int djs(int k){
38 if (k<N-4)return mu[k];
39 if (sum[k])return sum[k];
40 int ans=1;
41 for(int i=2,j;i<=k;i=j+1){
42 j=k/(k/i);
43 ans-=(j-i+1)*djs(k/i);
44 }
45 return sum[k]=ans;
46 }
47 ll calc_g(int n,int p){
48 if ((n<2)||(!p))return djs(n);
49 if (!id[n])id[n]=++V;
50 int x=id[n];
51 if (g[x][p])return g[x][p];
52 return g[x][p]=calc_g(n,p-1)+calc_g(n/a[p],p);
53 }
54 int main(){
55 scanf("%d%d%d",&n,&m,&k);
56 pre();
57 for(int i=1,j;i<=min(n,m);i=j+1){
58 j=min(n/(n/i),m/(m/i));
59 ans+=(calc_g(j,a[0])-calc_g(i-1,a[0]))*calc_f(m/i)*(n/i);
60 }
61 printf("%lld",ans);
62 }

[bzoj4652]循环之美的更多相关文章

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

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

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

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

  3. UOJ #221 【NOI2016】 循环之美

    题目链接:循环之美 这道题感觉非常优美--能有一个这么优美的题面和较高的思维难度真的不容易-- 为了表示方便,让我先讲一下两个符号.\([a]\)表示如果\(a\)为真,那么返回\(1\),否则返回\ ...

  4. LibreOJ2085 - 「NOI2016」循环之美

    Portal Description 给出\(n,m(n,m\leq10^9)\)和\(k(k\leq2000)\),求在\(k\)进制下,有多少个数值不同的纯循环小数可以表示成\(\dfrac{x} ...

  5. 「NOI2016」循环之美

    P1587 [NOI2016]循环之美 题目描述 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 $k$ 进制下,一个数的小数部分是纯循环的,那么它就 ...

  6. 「NOI2016」循环之美 解题报告

    「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足 ...

  7. luogu 1587 [NOI2016]循环之美

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

  8. bzoj4652 [Noi2016]循环之美

    Description 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在k进制下,一个数的小数部分是纯循环的,那么它就是美的.现在,牛牛想知道:对于已知 ...

  9. BZOJ4652: [Noi2016]循环之美(莫比乌斯反演,杜教筛)

    Description 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k  进制下,一个数的小数部分是纯循环的,那么它就是美的.现在,牛牛想知道:对 ...

随机推荐

  1. NOIP模拟79

    T1 F 解题思路 因为每个点会产生贡献当且仅当它在可以到他的点之前被删除,并且此题遵守期望的线性性. 因此设所有可以到达点 \(i\) 的数量为 \(c_i\) 那么答案就是 \(\sum \fra ...

  2. Verilog的数据流、行为、结构化与RTL级描述

    Verilog语言可以有多种方式来描述硬件,同时,使用这些描述方式,又可以在多个抽象层次上设计硬件,这是Verilog语言的重要特征. 在Verilog语言中,有以下3种最基本的描述方式: 数据流描述 ...

  3. for...in和Object.keys()区别

    区别: for in 用来枚举对象的属性,某些情况下,可能按照随机顺序遍历数组元素 object.keys() 可以返回对象属性为元素的数组,数组中属性名顺序和for in比那里返回顺序一样 ---f ...

  4. JBOSS未授权访问漏洞利用

    1. 环境搭建 https://www.cnblogs.com/chengNo1/p/14297387.html 搭建好vulhub平台后 进入对应漏洞目录 cd vulhub/jboss/CVE-2 ...

  5. 改善深层神经网络-week3编程题(Tensorflow 实现手势识别 )

    TensorFlow Tutorial Initialize variables Start your own session Train algorithms Implement a Neural ...

  6. Scrum Meeting 15

    第15次例会报告 日期:2021年06月09日 会议主要内容概述: 开发工作接近尾声,接下来两天重点放在单元测试.调CSS和增加数据集数量上. 一.进度情况 我们采用日报的形式记录每个人的具体进度,链 ...

  7. BF算法和KMP算法

    这两天复习数据结构(严蔚敏版),记录第四章串中的两个重要算法,BF算法和KMP算法,博主主要学习Java,所以分析采用Java语言,后面会补上C语言的实现过程. 1.Brute-Force算法(暴力法 ...

  8. AVL树的插入和删除

    一.AVL 树 在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为 1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度 ...

  9. Spring Cloud Gateway夺命连环10问?

    大家好,我是不才陈某~ 最近有很多小伙伴私信我催更 <Spring Cloud 进阶>,陈某也总结了一下,最终原因就是陈某之前力求一篇文章将一个组件重要知识点讲透,这样导致了文章篇幅很长, ...

  10. 数组中的逆序对 牛客网 剑指Offer

    数组中的逆序对 牛客网 剑指Offer 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对10000000 ...