$n \leq 1e9,m \leq 1e9,k \leq 2000$,求$k$进制下$\frac{x}{y}$有多少种不同的纯循环数取值,$1 \leq x \leq n,1 \leq y \leq m$。纯循环数是指小数点后直接就开始循环,整数也算。

与上个题的丑陋相比这个题不知道美到哪里去。。虽然自己没想出来。

提示说了,出现相同余数时有纯循环。假设循环节是$l$,那么$xk^l$和$x$除$y$会得到相同余数--同余!$xk^l \equiv x (\mod y)$。由于题目要互不相同的,所以$x$和$y$互质,有逆元。两边同乘$x$的逆元,得$k^l \equiv 1 (\mod y)$,存在这样的$l$,由欧拉定理得只需$k$与$y$互质即可。可以开始推式子。

$\\ \sum_{x=1}^{n}\sum_{y=1}^m[(x,y)=1][(k,y)=1]$
$\\ =\sum_{y=1}^{m}[(k,y)=1]\sum_{x=1}^{n}[(x,y)=1]$
$\\ =\sum_{y=1}^{m}[(k,y)=1]\sum_{x=1}^{n}\sum_{d|x,d|y}\mu(d)$
$\\ =\sum_{y=1}^{m}[(k,y)=1]\sum_{d|y}\mu(d)\left \lfloor \frac{n}{d} \right \rfloor$
$\\ =\sum_{d=1}^{m}\mu(d)\left \lfloor \frac{n}{d} \right \rfloor\sum_{d|y,y \leq m}[(k,y)=1]$
$\\ =\sum_{d=1}^{m}\mu(d)\left \lfloor \frac{n}{d} \right \rfloor\sum_{i=1}^{\left \lfloor \frac{m}{d} \right \rfloor}[(k,i)=1][(k,d)=1]$
$\\ =\sum_{d=1}^{min(n,m)}\mu(d)\left \lfloor \frac{n}{d} \right \rfloor[(k,d)=1]\sum_{i=1}^{\left \lfloor \frac{m}{d} \right \rfloor}[(k,i)=1]$

可以发现$f(t)=\sum_{i=1}^t[(k,i)=1]=\left \lfloor \frac{t}{k} \right \rfloor f(k)+f(t \mod k)$。这样就可以O(1)算后面那坨,在min(n,m)的时间内得到84分。

 //#include<iostream>
#include<cstring>
#include<cstdio>
//#include<math.h>
//#include<set>
//#include<queue>
//#include<bitset>
//#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
} //Pay attention to '-' , LL and double of qread!!!! int n,m,K;
int f[]; #define maxm 20000011
int miu[maxm],prime[maxm],lp=; bool notprime[maxm];
void pre(int n)
{
miu[]=;
for (int i=;i<=n;i++)
{
if (!notprime[i]) {prime[++lp]=i; miu[i]=-;}
for (int tmp,j=;j<=lp && 1ll*i*prime[j]<=n;j++)
{
notprime[tmp=i*prime[j]]=;
if (i%prime[j]) miu[tmp]=-miu[i];
else {miu[tmp]=; break;}
}
}
} int gcd(int a,int b) {while (b^=a^=b^=a%=b); return a;}
int getf(int x) {return x/K*f[K]+f[x%K];} int main()
{
n=qread(); m=qread(); K=qread();
for (int i=;i<=K;i++) f[i]=f[i-]+(gcd(i,K)==);
pre(min(n,m));
LL ans=;
for (int i=,to=min(n,m);i<=to;i++) if ((i%K>) && (f[i%K]-f[(i-)%K])>)
ans+=miu[i]*(n/i)*1ll*getf(m/i);
printf("%lld\n",ans);
return ;
}

前面有个$\left \lfloor \frac{n}{d} \right \rfloor$是可以分块枚举的,如果能求快一点对所有$t=\left \lfloor \frac{n}{d} \right \rfloor$求出$g(t,k)=\sum_{i=1}^t[(i,k)=1]\mu(i)$就好了。

!$k=p^cq$,设$p$为$k$的一个质因子,则$k$可以这么表示,其中$(q,p)=1$。要求与$k$互质的,那就求与$q$互质的,挑掉与$p$不互质和与$q$互质的。与$p$不互质的有一定是$p$的倍数,因为$p$是质数嘛。所以

$\\ g(t,k)=\sum_{i=1}^{t}[(k,i)=1]\mu(i)$
$\\ =\sum_{i=1}^{t}[(i,q)=1]\mu(i)-\sum_{j=1}^{\left \lfloor \frac{t}{p} \right \rfloor}[(jp,q)=1]\mu(jp)$
$\\ =g(t,q)-\mu(p)g(\left \lfloor \frac{t}{p} \right \rfloor,q)$
$\\ =g(t,q)+g(\left \lfloor \frac{t}{p} \right \rfloor,q)$

建立一个根号复杂度的递推关系,$k$那一维的数量是常数级别的,毕竟2000以内质因子最多的数也没几个质因子。递归边界的话,如果t=0直接返回0,如果k=1那就是$\mu$的前缀和,需要再写一个杜教筛对所有n除以d的下取整数值的$\mu$前缀和处理出来。

*LOJ#2085. 「NOI2016」循环之美的更多相关文章

  1. 【LOJ】#2085. 「NOI2016」循环之美

    题解 我们要求的其实是这个东西= = \(\sum_{i = 1}^{n}\sum_{j = 1}^{n}[(i,j) == 1][(j,k) == 1]\) 然后变一下形 \(\sum_{j = 1 ...

  2. LibreOJ2085 - 「NOI2016」循环之美

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

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

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

  4. LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美

    题目传送门:LOJ #2085. 两个月之前做的傻题,还是有必要补一下博客. 题意简述: 求分子为不超过 \(n\) 的正整数,分母为不超过 \(m\) 的正整数的所有互不相等的分数中,有多少在 \( ...

  5. 「NOI2016」循环之美

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

  6. 「NOI2016」循环之美(小性质+min_25筛)

    传送门. 题解 感觉这题最难的是第一个结论. x/y首先要互质,然后如果在10进制是纯循环小数,不难想到y不是2.5的倍数就好了. 因为十进制下除以2和5是除得尽的. 必然会多出来的什么东西. 如果是 ...

  7. 【刷题】LOJ 2818 「eJOI2018」循环排序

    题目描述 本题译自 eJOI2018 Problem F「Cycle Sort」 给定一个长为 \(n\) 的数列 \(\{a_i\}\) ,你可以多次进行如下操作: 选定 \(k\) 个不同的下标 ...

  8. LOJ#2086. 「NOI2016」区间

    $n \leq 500000$个区间,从中挑出一些,使得至少有一个点被$m$个选中区间包含,且选中区间长度的极差最小. 区间题死脑筋晚期:把区间按左端点排序,然后右端点用个优先队列来弹,然后需要维护下 ...

  9. LOJ#2084. 「NOI2016」网格

    $n,m \leq 1e9$,$n*m$的网格中有$c \leq 1e5$个是黑的,其他是白的.问:使至少两个白的不连通,最少需要再把几个白的涂黑. 可以发现答案是-1,0,1,2啦.-1要么没白的, ...

随机推荐

  1. Linux基础-Linux常用命令

    Linux(/'lainʌks/)系统特点:稳定,安全,开源(一切皆文件) 装上SSH协议就可以连接Linux 装虚拟机(SSH) win用xshell工具 Linux命令:每日一个linux命令 p ...

  2. BootStrap下拉框搜索功能

    <!DOCTYPE html> <html> <head> <title>jQuery bootstrap-select可搜索多选下拉列表插件-www. ...

  3. MongDB之各种查询操作

    接口IMongDaoFind: package com.net.test.mongdb.dao; public interface IMongDaoFind { public void findUse ...

  4. Python基础学习总结__Day1

    一.Python是一门什么类型语言 1.解释型:一边编译一边执行,劣势是运行速度慢,但通过运用PyPy交互解释器(JIT技术)会让python程序执行速度快很多.优势是可移植性强. 2.强类型:即类型 ...

  5. python3.7 倒计时

    #!/usr/bin/env python __author__ = "lrtao2010" # python3.7 倒计时 import time for i in range( ...

  6. python——用递归的方法求x的y次幂

    def function(x,y): : : )*x ): number = int(input('请输入x的值:')) y = int(input('请输入y的值:')) print('x的y次幂的 ...

  7. CTU Open Contest 2017

    这场题很水.水题我就懒得贴了. B - Pond Cascade 优先队列维护这个水池需要多少时间 或者 直接扫一遍. #include <cstdio> #include <cst ...

  8. 网络流 EK算法模板。

    这篇博客讲得很好 #include<queue> #include<stdio.h> #include<string.h> using namespace std; ...

  9. postgreysql

    基础 syntax * \help 生成所有的pg命令 * abort 终止事务/work * alter aggregate 修改聚合函数的定义 ALTER AGGREGATE name ( typ ...

  10. CSS需要注意的问题1(转生活因拼搏而精彩的网易博客)

      1.检查HTML元素(如:<ul>.<div>).属性(如:class=”")是否有拼写错误.是否忘记结束标记(如:<br />) 因为Xhtml 语 ...