http://uoj.ac/problem/221

因为\(a\)和\(b\)不互质时,\(\frac ab=\frac{\frac a{(a,b)}}{\frac b{(a,b)}}\),所以只用求\(a\)和\(b\)互质时的满足条件的个数。

\(\frac ab\)在\(k\)进制下是纯循环小数,我们先假设循环节长度为\(l\),这样\(\frac ab\times k^l-\frac ab\)的小数部分就是0,也就是这是个整数。

\(\frac{a\left(k^l-1\right)}b\)是个整数,就是说\(b|a\left(k^l-1\right)\)。又因为\(a\bot b\),所以\(b|\left(k^l-1\right)\)。

判断\(\frac ab\)是否是\(k\)进制下的纯循环小数就转变成了判断是否存在一个\(l,l\geq 0\),满足\(\left(k^l-1\right)\mod b=0\)。

当\(k\)和\(b\)不互质时,对于所有的\(l\),\(b\)和\(k^l\)有共同的质因子,又因为\(k^l\bot\left(k^l-1\right)\),所以\(b\)和\(k^l\)的共同的质因子是\(k^l-1\)没有的,所以不存在\(l\)满足\(b|\left(k^l-1\right)\)。

当\(k\)和\(b\)互质时,由欧拉定理:\(k^{\varphi(b)}\mod b=1\),存在\(l=\varphi(b)\)。

这样答案就变成了:$$\sum_{a=1}n\sum_{b=1}m[b\bot k][a\bot b]$$

化一波式子:

\[\begin{aligned}
&\sum_{a=1}^n\sum_{b=1}^m[b\bot k][a\bot b]\\
=&\sum_{d=1}^n\mu(d)\sum_{a=1}^{\left\lfloor\frac nd\right\rfloor}\sum_{b=1}^{\left\lfloor\frac md\right\rfloor}[bd\bot k]\\
=&\sum_{d=1}^n\mu(d)[d\bot k]\left\lfloor\frac nd\right\rfloor\sum_{b=1}^{\left\lfloor\frac md\right\rfloor}[b\bot k]
\end{aligned}
\]

\(\sum\limits_{i=1}^n[i\bot k]\)很好预处理后\(O(1)\)计算。

重点是怎么算\(\sum\limits_{d=1}^n\mu(d)[d\bot k]\)?

先放宽限制,把\([d\bot k]\)的限制去掉,这样就是对\(O\left(\sqrt n+\sqrt m\right)\)个下取整取值求\(\mu\)的前缀和,可以先\(O\left(n^{\frac 23}\right)\)大力杜教筛一波。

然后考虑\(S(i,n)\)表示\(1\sim n\)中与\(k\)的前\(i\)个质因子互质的数的\(\mu\)值和,这样\(S(i,n)=S(i-1,n)-\mu\left(p_i\right)S\left(i,\left\lfloor\frac n{p_i}\right\rfloor\right)\)递推求出,时间复杂度\(O\left(\left(\sqrt n+\sqrt m\right)\log k\right)\)(假设\(k\)的不同质因子有\(\log k\)个)。

最后对\(O\left(\sqrt n+\sqrt m\right)\)个不同的\(\left\lfloor\frac nd\right\rfloor\)和\(\left\lfloor\frac md\right\rfloor\)的取值进行分段求和即可。

时间复杂度\(O\left(n^{\frac 23}+\left(\sqrt n+\sqrt m\right)\log k\right)\)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll; const int N = 1000003; bool notp[N];
int mu[N], sum_mu[N], prime[N], Num = 0; void Euler_shai() {
mu[1] = sum_mu[1] = 1;
for (int i = 2; i <= 1000000; ++i) {
if (!notp[i]) prime[++Num] = i, mu[i] = -1;
for (int j = 1; j <= Num && prime[j] * i <= 1000000; ++j) {
notp[prime[j] * i] = true;
if (i % prime[j] == 0) break;
mu[prime[j] * i] = -mu[i];
}
sum_mu[i] = sum_mu[i - 1] + mu[i];
}
} int R[N], cnt = 0, sum_mu2[N], n, m, k, S[N], pr[N], prnum = 0; const int mo = 2333333; struct HashTable {
int pos[mo], num[mo]; void ins(int nu, int po) {
int tmp = nu % mo;
while (num[tmp]) {++tmp; if (tmp == mo) tmp = 0;}
num[tmp] = nu;
pos[tmp] = po;
} int query(int nu) {
int tmp = nu % mo;
while (num[tmp] != nu) {++tmp; if (tmp == mo) tmp = 0;}
return pos[tmp];
}
} HT; int sum[N], id[N]; int gcd(int a, int b) {return b ? gcd(b, a % b) : a;} void pre_sum() {
for (int i = 1; i <= k; ++i) {
sum[i] = sum[i - 1];
if (gcd(i, k) == 1)
++sum[i];
}
} int cal(int num) {return sum[k] * (num / k) + sum[num % k];} int Sum(int num) {return num <= 1000000 ? S[id[num]] : S[HT.query(num)];} int main() {
scanf("%d%d%d", &n, &m, &k);
Euler_shai(); for (int i = 1, j = 1; i <= n && i <= m; ++i) {
j = m / (m / i);
i = n / (n / i);
if (i > j) i = j;
R[++cnt] = i;
if (i > 1000000) HT.ins(i, cnt);
} for (int i = 1; i <= cnt; ++i) {
int num = R[i], &ret = S[i];
if (num <= 1000000) {ret = sum_mu[num]; id[num] = i; continue;}
ret = 1;
for (int j = 2, pre = 1; j <= num; pre = j, ++j) {
j = num / (num / j);
ret -= 1ll * Sum(num / j) * (j - pre);
}
} for (int i = 1; i <= Num && prime[i] <= k; ++i)
if (k % prime[i] == 0)
pr[++prnum] = prime[i]; for (int i = 1, pi = pr[1]; i <= prnum; pi = pr[++i])
for (int j = 1; j <= cnt; ++j)
S[j] += Sum(R[j] / pi); pre_sum(); ll ans = 0;
for (int tmp = 1, i = 1, j = 1; i <= n && i <= m; ++tmp, ++i) {
j = m / (m / i);
i = n / (n / i);
if (i > j) i = j;
ans += 1ll * (S[tmp] - S[tmp - 1]) * (n / i) * cal(m / i);
} printf("%lld\n", ans);
return 0;
}

【UOJ #221】【NOI 2016】循环之美的更多相关文章

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

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

  2. [NOI 2016]循环之美

    Description 题库链接 给出十进制下的 \(n,m,k\) ,求 \(\frac{i}{j},i\in[1,n],j\in[1,m]\) 在 \(k\) 进制下不同的纯循环小数个数. 纯循环 ...

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

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

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

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

  5. [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分

    [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分 题意 给定一个字符串 \(S\), 求有多少种将 \(S\) 的子串拆分为形如 AABB 的拆分方案 \(| ...

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

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

  7. [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字

    [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...

  8. LibreOJ2085 - 「NOI2016」循环之美

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

  9. 「NOI2016」循环之美

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

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

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

随机推荐

  1. idea开发工具下载安装教程

    我用这款工具主要用于java开发 在安装这个工具之前需要配置java的环境 java的jdk环境配置 jdk:1.8 jdk官网下载链接 --->点我 进入之后,下拉  选择 jdk1.8版本 ...

  2. Python 深拷贝、浅拷贝

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 首先,对赋值操作我们要有以下认识: 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( ...

  3. 用命令对sql进行备份

    利用T-SQL语句,实现数据库的备份与还原的功能 体现了SQL Server中的四个知识点: 1. 获取SQL Server服务器上的默认目录 2. 备份SQL语句的使用 3. 恢复SQL语句的使用, ...

  4. CVE-2010-0249 极光

    传说中的极光漏洞 Microsoft Internet Explorer非法事件操作内存破坏漏洞 Microsoft Internet Explorer是微软Windows操作系统中默认捆绑的WEB浏 ...

  5. IDEA创建Spring Boot项目

    首先安装Spring Boot CLI 先确定自己安装的JDK是1.8版本或者以上,然后下载Srping Boot CLI,Spring Boot CLI下载地址,下载下来是一个压缩包,解压,得到一个 ...

  6. LoadRunner如何获得参数化中每个关键字的搜索响应时间

    LoadRunner如何获得参数化中每个关键字的搜索响应时间 在测试搜索引擎时我们一般采用大量的搜索关键字,有时有必要了解在并发访问的情况下每个关键字的响应时间,一般如果不对脚本进行处理的话你可以获得 ...

  7. tp5总结(三)

    1.控制器 1-1.加载页面[使用系统函数eg:http://ww:7070/tp5-2/public/admin/test/load] 1-2.加载页面[继承控制器方法eg:http://ww:70 ...

  8. windows svn post-commit 报错解决 error resolving case

    在svn仓库目录下有个hooks目录,下面建一个 post-commit.cmd 文件,有代码提交到仓库,自动checkout到指定目录.   @echo onSET REPOS=%1SET USER ...

  9. CentOS 编译源码安装MySQL-5.6.16

    mysql5.6.16的安装和之前的5.5.5.1有些不同,编译的时候不再使用./configure来进行了,使用了cmake命令来进行编译项目. 1.准备编译环境 yum -y installmak ...

  10. Scala入门1(单例对象和伴生类)

    一.Hello World程序的执行原理 参考http://blog.csdn.net/zhangjg_blog/article/details/22760957 object HelloWorld{ ...