题目传送门:LOJ #2085。

两个月之前做的傻题,还是有必要补一下博客。

题意简述:

求分子为不超过 \(n\) 的正整数,分母为不超过 \(m\) 的正整数的所有互不相等的分数中,有多少在 \(k\) 进制下的纯循环小数。

题解:

设分子为 \(x\),分母为 \(y\)。

首先,因为要求的是互不相等的分数,取最简分数,即 \(x\perp y\)。

其次,要求是纯循环小数,考虑竖式除法的过程,可以发现 \(\displaystyle\frac{x}{y}\) 在 \(k\) 进制下纯循环相当于存在正整数 \(l\) 使得 \(x\equiv x\cdot k^l\pmod{y}\)。

由于 \(x\perp y\),两边约去 \(x\) 得到 \(k^l\equiv 1\pmod{y}\),显然当 \(k\) 属于 \(y\) 的缩系中时可能成立,即 \(y\perp k\)。

综上,答案为 \(\displaystyle\sum_{i=1}^{n}\sum_{j=1}^{m}[i\perp j][j\perp k]\)。

为了方便,以下用 \(a\div b\) 表示 \(\displaystyle\left\lfloor\frac{a}{b}\right\rfloor\)。答案为:

\[\begin{aligned}\mathbf{Ans}&=\sum_{i=1}^{n}\sum_{j=1}^{m}[i\perp j][j\perp k]\\&=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|i,d|j}\mu(d)[j\perp k]\\&=\sum_{d=1}^{\min(n,m)}\mu(d)\sum_{i=1}^{n\div d}\sum_{j=1}^{m\div d}[jd\perp k]\\&=\sum_{d=1}^{\min(n,m)}\mu(d)(n\div d)\sum_{j=1}^{m\div d}[j\perp k][d\perp k]\\&=\sum_{d=1}^{\min(n,m)}\mu(d)[d\perp k](n\div d)S_{[x\perp k]}(m\div d)\end{aligned}\]

其中 \(S_{f}(n)\) 表示 \(\displaystyle\sum_{i=1}^{n}f(i)\)。
\(S_{[x\perp k]}(n)=(n\div k)\varphi(k)+S_{[x\perp k]}(n\bmod k)\) 可以 \(\mathcal{O}(k)\) 预处理,\(\mathcal{O}(1)\) 回答询问。

对外层 \(n\div d\) 和 \(m\div d\) 进行整除分块,问题转化为计算 \(\displaystyle\sum_{i=1}^{n}\mu(i)[i\perp k]\)。

设 \(\displaystyle S(n,k)=\sum_{i=1}^{n}\mu(i)[i\perp k]\),则有:

\[\begin{aligned}S(n,k)&=\sum_{i=1}^{n}\mu(i)[i\perp k]\\&=\sum_{i=1}^{n}\mu(i)\sum_{d|i,d|k}\mu(d)\\&=\sum_{d|k}\mu(d)\sum_{i=1}^{n\div d}\mu(id)\\&=\sum_{d|k}\mu(d)\sum_{i=1}^{n\div d}\mu(i)\mu(d)[i\perp d]\\&=\sum_{d|k}\mu^2(d)\sum_{i=1}^{n\div d}\mu(i)[i\perp d]\\&=\sum_{d|k}\mu^2(d)S(n\div d,d)\end{aligned}\]

递归,记忆化搜索即可。边界:\(S(0,k)=0\) 和 \(\displaystyle S(n,1)=\sum_{i=1}^{n}\mu(i)\) 使用杜教筛计算。

复杂度大约为 \(\mathcal{O}\left(n^{2/3}+\sigma_0(k)\sqrt{n}+k\right)\)。

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>typedef long long LL;
const int MK = 2005;
const int S = 31622;
const int MN23 = 1000005;
const int MP = 78505;
const int MD = 25;int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }bool ip[MN23];
int p[MP], pc;
int mu[MN23], Smu[MN23];inline void Init(int N) {mu[1] = 1;for (int i = 2; i <= N; ++i) {if (!ip[i]) p[++pc] = i, mu[i] = -1;for (int j = 1; j <= pc && p[j] * i <= N; ++j) {ip[p[j] * i] = 1;if (i % p[j]) mu[p[j] * i] = -mu[i];else break;}}for (int i = 1; i <= N; ++i) Smu[i] = Smu[i - 1] + mu[i];
}int N, M, K, N23;
int A[MK], Vl[MD], cd;std::map<int, LL> mp[MD];LL Sum(int N, int K) {if (!N) return 0;if (K == 1 && N <= N23) return Smu[N];if (mp[K].count(N)) return mp[K][N];if (K > 1) {LL Ans = 0;for (int j = 1; j <= K; ++j)if (Vl[K] % Vl[j] == 0 && mu[Vl[j]])Ans += Sum(N / Vl[j], j);return mp[K][N] = Ans;}LL Ans = 1;for (int i = 2, j; i <= N; i = j + 1) {j = N / (N / i);Ans -= (j - i + 1) * Sum(N / i, 1);}return mp[1][N] = Ans;
}LL Ans;int main() {scanf("%d%d%d", &N, &M, &K);for (int i = 1; i <= K; ++i) A[i] = A[i - 1] + (gcd(i, K) == 1);Init(N23 = std::max((int)pow(N, 2./3), K));for (int i = 1; i <= K; ++i) if (K % i == 0 && (mu[i] || i == K)) Vl[++cd] = i;for (int i = 1, kN, kM, j; i <= N && i <= M; i = j + 1) {kN = N / i, kM = M / i;j = std::min(N / kN, M / kM);Ans = Ans + kN * ((LL)kM / K * A[K] + A[kM % K]) * (Sum(j, cd) - Sum(i - 1, cd));}printf("%lld\n", Ans);return 0;
}

转载于:https://www.cnblogs.com/PinkRabbit/p/NOI2016D1T3.html

LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美相关推荐

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

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

  2. *LOJ#2085. 「NOI2016」循环之美

    $n \leq 1e9,m \leq 1e9,k \leq 2000$,求$k$进制下$\frac{x}{y}$有多少种不同的纯循环数取值,$1 \leq x \leq n,1 \leq y \leq ...

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

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

  4. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

  5. 洛谷 P2046 BZOJ 2007 海拔(NOI2010)

    题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...

  6. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理

    令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...

  7. 洛谷 3784(bzoj 4913) [SDOI2017]遗忘的集合——多项式求ln+MTT

    题目:https://www.luogu.org/problemnew/show/P3784 https://www.lydsy.com/JudgeOnline/problem.php?id=4913 ...

  8. 洛谷 P4546 bzoj 5020 在美妙的数学王国中畅游 —— LCT+泰勒展开

    题目:https://www.luogu.org/problemnew/show/P4546 先写了个55分的部分分,直接用LCT维护即可,在洛谷上拿了60分: 注意各处 pushup,而且 spla ...

  9. 【LOJ】【树形DP】2485 「CEOI2017」Chase

    LOJ 2485 「CEOI2017」Chase 题目大意 ◇题目传送门◆ 似乎压缩起来有点困难,所以就不压缩了吧 QwQ- 分析 考虑扔一个磁铁能够产生的让逃亡者和追逐者之间的差异. 这个差异就是这 ...

最新文章

  1. 153. Find Minimum in Rotated Sorted Array
  2. 华为云计算之储存基础知识
  3. 设计模式-结构型-适配器
  4. 高维数据使用npy格式保存
  5. MathType插入带序号公式的两种方法
  6. 搭建实用深度学习环境(Ubuntu16.10+Theano0.8.2+Tensorflow0.11.0rc1+Keras1.1.0)
  7. C语言进阶深度学习目录表
  8. Jenkins 学习总结(9)—— Jenkins 有哪些替代方案?
  9. LaTeX(3)——LaTeX数学公式
  10. 转载:动态调用WebService(C#)
  11. 【虚拟机】安装windowxp/windows2003系统 镜像文件 及 安装过程
  12. 戴尔 Inspiron 530s 通过 Clover_v2.5k_r5093 安装 macOS Catalina 10.15.3 教程
  13. 域名带www和不带的区别
  14. Html5固定链接生成二维码的技巧
  15. labelmx条码打印软件如何批量制作服装吊牌
  16. C++小数该用什么数据类型
  17. HCIE华为面试-BGP负载分担
  18. C语言的从零开始和我自己的心路历程
  19. gsoap使用方法及心得
  20. html5第一人,中国高空走钢丝第一人,阿迪力·吾休尔(创5项世界纪录)

热门文章

  1. 三星上线售价99万8K电视 网友:是不是多打了一位数
  2. Facebook去年从中国获50亿美元广告收入 占营收10%
  3. mvc5 @html,如何在MVC 5中使用 HTML5 Viewer
  4. nosql mysql mongodb_nosql数据库MongoDB的用法
  5. HTML 和 JavaScript 编程
  6. FLEX开发人员中心部分下载
  7. linux mod文件,mod文件扩展名,mod文件怎么打开?
  8. 【kafka】浅谈Kafka的多线程消费的设计
  9. 【Flink】 Flink 应用资源分配问题排查思路
  10. 【Flink】Flink 1.12.2 TaskSlotTable