LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美
题目传送门: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\)。答案为:
\]
其中 \(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]\),则有:
\]
递归,记忆化搜索即可。边界:\(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;
}
LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美的更多相关文章
- LOJ 2567: 洛谷 P3643: bzoj 4584: 「APIO2016」划艇
题目传送门:LOJ #2249. 题意简述: 有 \(n\) 个位置,第 \(i\) 个位置可以填在 \([a_i,b_i]\) (\(1\le a_i\le b_i\le 10^9\))之间的整数, ...
- LOJ 2249: 洛谷 P2305: bzoj 3672: 「NOI2014」购票
题目传送门:LOJ #2249. 题意简述: 有一棵以 \(1\) 号节点为根节点的带边权的树. 除了 \(1\) 号节点的所有节点上都有人需要坐车到达 \(1\) 号节点. 除了 \(1\) 号节点 ...
- LibreOJ2085 - 「NOI2016」循环之美
Portal Description 给出\(n,m(n,m\leq10^9)\)和\(k(k\leq2000)\),求在\(k\)进制下,有多少个数值不同的纯循环小数可以表示成\(\dfrac{x} ...
- 「NOI2016」循环之美 解题报告
「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足 ...
- 「NOI2016」循环之美
P1587 [NOI2016]循环之美 题目描述 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 $k$ 进制下,一个数的小数部分是纯循环的,那么它就 ...
- 【LOJ】#2085. 「NOI2016」循环之美
题解 我们要求的其实是这个东西= = \(\sum_{i = 1}^{n}\sum_{j = 1}^{n}[(i,j) == 1][(j,k) == 1]\) 然后变一下形 \(\sum_{j = 1 ...
- *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 ...
- 「NOI2016」循环之美(小性质+min_25筛)
传送门. 题解 感觉这题最难的是第一个结论. x/y首先要互质,然后如果在10进制是纯循环小数,不难想到y不是2.5的倍数就好了. 因为十进制下除以2和5是除得尽的. 必然会多出来的什么东西. 如果是 ...
- 洛谷 8 月月赛 & 「PMOI」Round · 04
T1 T166167 「PMOI-4」人赢 题目大意 给一个数列的前两项分别为\(n\)和\(m\) 当\(i\geq3\)时\(a_i = a_{i-1}*a_{i-2}\)的个位 给定\(n\), ...
随机推荐
- MySQL实战45讲学习笔记:第二十八讲
一.读写分离架构 在上一篇文章中,我和你介绍了一主多从的结构以及切换流程.今天我们就继续聊聊一主多从架构的应用场景:读写分离,以及怎么处理主备延迟导致的读写分离问题. 我们在上一篇文章中提到的一主多从 ...
- elasticsearch 7.5.0 学习笔记
温馨提示:电脑端看不到右侧目录的话请减小缩放比例. API操作-- 新建或删除查询索引库 新建索引库 新建index,要向服务器发送一个PUT请求,下面是使用curl命令新建了一个名为test的ind ...
- Note | PyTorch官方教程学习笔记
目录 1. 快速入门PYTORCH 1.1. 什么是PyTorch 1.1.1. 基础概念 1.1.2. 与NumPy之间的桥梁 1.2. Autograd: Automatic Differenti ...
- python3 获取当前日期的时间戳,以及n天后的日期时间戳
#coding=utf- import time import datetime t=datetime.datetime.now() #当前日期 t1 =t.strftime('%Y-%m-%d 00 ...
- java线程池模拟并发
public class CountDownLatchTest1 implements Runnable{ final AtomicInteger number = new AtomicInteger ...
- .NET Core开发的iNeuOS物联网平台部署树霉派(raspbian),从网关到云端整体解决方案。助力2019中国.NET峰会。
2019 中国.NET 开发者峰会正式启动 目 录 1. 概述... 2 2. 树莓派硬件配置... 2 3. 软件信息... 3 4. Raspb ...
- SpringBoot第七篇:整合Mybatis-Plus
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10881666.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 一看这个名 ...
- Laravel服务容器的绑定与解析
本篇文章给大家带来的内容是关于Laravel服务容器的绑定与解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 前言 老实说,第一次老大让我看laravel框架手册的那天早上,我 ...
- axios的各种传参方式
axios的各种传参方式 1. params方式 axios({ url: '/users', method: 'get', params: { id: '11111', name: '22222' ...
- iOS block疑难解答
1,为什么需要加__block ARC环境下,一旦Block赋值就会触发copy,__block就会copy到堆上,Block也是__NSMallocBlock.ARC环境下也是存在__NSStack ...