Solution

由数论基础知识 答案即为$$\sum_{i = 1}^n\sum_{j = 1}^m[i \perp j][j \perp k]$$

莫反套路可化为$$\sum_{d = 1}\mu(d)[d \perp k] \lfloor \frac{n}{d} \rfloor \sum_{j=1}^{\lfloor \frac{m}{d} \rfloor}[j \perp k]$$

如果我们可以求出\(g(x)=\sum_{i=1}^x [x \perp k]\),那么后面那坨东西就容易分块搞掉

然后我们惊奇的发现\(g(n)=\lfloor \frac{n}{k} \rfloor g(k) + g(n\mod k)\)

然后我们只需要求\(f(n)=\sum_{i=1}^n \mu(i)[i \perp k]\)的前缀和了

这一部分是本题难点。

发现

\[\begin{aligned}
f(n)&=\sum_{i=1}^n f(\lfloor \frac{n}{i} \rfloor)[i \perp k] - \sum_{i=2}^n f(\lfloor \frac{n}{i} \rfloor)[i \perp k] \\
&=\sum_{i=1}^n \sum_{j=1}^{\lfloor \frac{n}{i} \rfloor} \mu(j) [ij \perp k] - \sum_{i=2}^n f(\lfloor \frac{n}{i} \rfloor)[i \perp k]\\
&=\sum_{T=1}^n [T \perp k] \sum_{d | k}\mu(d) - \sum_{i=2}^n f(\lfloor \frac{n}{i} \rfloor)[i \perp k] \\
&=1 - \sum_{i=2}^n f(\lfloor \frac{n}{i} \rfloor)[i \perp k]
\end{aligned}
\]

至此,我们成功构造出了杜教筛式子。

问题迎刃而解。

Code

#include <cstdio>
#include <iostream>
#include <map>
#define LL long long
using namespace std;
inline LL read() {
LL res = 0; char ch = getchar();
for(; !isdigit(ch); ch = getchar());
for(; isdigit(ch); ch = getchar()) res = (res << 1) + (res << 3) + (ch ^ 48);
return res;
}
int n, k, vis[3000000], p[3000000], cnt, g[3000000], m, mu[3000000], f[3000000];
LL ans;
void Sieve() {
mu[1] = 1;
for(int i = 2; i <= 2000000; ++i) {
if(!vis[i]) p[++cnt] = i, mu[i] = -1;
for(int j = 1; j <= cnt && p[j] * i <= 2000000; ++j) {
vis[i * p[j]] = 1;
if(i % p[j] == 0) break;
mu[i * p[j]] = - mu[i];
}
}
}
int gcd(int x, int y) {return (y == 0) ? x : gcd(y, x % y);}
map <int, LL> re;
void Init() {
for(int i = 1; i <= k; ++i) {
g[i] = g[i - 1];
if(gcd(i, k) == 1) ++ g[i];
}
for(int i = 1; i <= 2000000; ++i) {
f[i] = f[i - 1];
if(gcd(i, k) == 1) f[i] += mu[i];
}
return ;
}
LL G(int x, int y) {return x / y * g[y] + g[x % y];}
LL F(int x) {
if(x <= 2000000) return f[x];
if(re.find(x) != re.end()) return re[x];
LL res = 1;
for(int l = 2, r; l <= x; l = r + 1) {
r = x / (x / l);
res -= F(x / l) * (G(r, k) - G(l - 1, k));
}
return re[x] = res;
}
int main() {
n = read(), m = read(), k = read();
Sieve();
Init();
for(int l = 1, r; l <= n && l <= m; l = r + 1) {
r = min(n / (n / l), m / (m / l));
ans = ans + 1ll * (F(r) - F(l - 1)) * (n / l) * G(m / l, k);
}
printf("%lld\n",ans);
}

【NOI2016】 循环之美 题解的更多相关文章

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

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

  2. luogu 1587 [NOI2016]循环之美

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

  3. 题解 P1587 【[NOI2016]循环之美】

    知识点:莫比乌斯反演 积性函数 杜教筛 废话前言: 我是古明地恋,写这篇题解的人已经被我 请各位读者自行无视搞事的恋恋带有删除线的内容,谢谢茄子. 这道题目本身并不难,但是公式推导/代码过程中具有迷惑 ...

  4. bzoj4652 [Noi2016]循环之美

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

  5. [NOI2016]循环之美

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

  6. BZOJ4652 [Noi2016]循环之美 【数论 + 莫比乌斯反演 + 杜教筛】

    题目链接 BZOJ 题解 orz 此题太优美了 我们令\(\frac{x}{y}\)为最简分数,则\(x \perp y\)即,\(gcd(x,y) = 1\) 先不管\(k\)进制,我们知道\(10 ...

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

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

  8. 并不对劲的bzoj4652:loj2085:uoj221:p1587:[NOI2016]循环之美

    题目大意 对于已知的十进制数\(n\)和\(m\),在\(k\)进制下,有多少个数值上互不相等的纯循环小数,可以用\(x/y\)表示,其中 \(1\leq x\leq n,1\leq y\leq m\ ...

  9. luogu P1587 [NOI2016]循环之美

    传送门 首先要知道什么样的数才是"纯循环数".打表可以发现,这样的数当且仅当分母和\(k\)互质,这是因为,首先考虑除法过程,每次先给当前余数\(*k\),然后对分母做带余除法,那 ...

随机推荐

  1. 5.6 NOI模拟

    \(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...

  2. 【原创】Python 极验滑块验证

    本文仅供学习交流使用,如侵立删! 记一次 极验滑块验证分析并通过 操作环境 win10 . mac Python3.9 selenium.seleniumwire 分析 最近在做的一个项目登录时会触发 ...

  3. web前端要学些什么,学习思路

    有没有Web前端大神给个意见 我已学了 html  css JS 马上要学Vue或React不知道那个好 需不需要先了解一下jQuery 还需要学些什么

  4. k8s驱逐篇(2)-kubelet节点压力驱逐

    kubelet节点压力驱逐 kubelet监控集群节点的 CPU.内存.磁盘空间和文件系统的inode 等资源,根据kubelet启动参数中的驱逐策略配置,当这些资源中的一个或者多个达到特定的消耗水平 ...

  5. Redis 17 缓存穿透 缓存击穿 缓存雪崩

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 使用缓存的问题 ...

  6. 急如闪电快如风,彩虹女神跃长空,Go语言高性能Web框架Iris项目实战-初始化项目ep00

    在Golang Web编程的世界里,君不言高性能则已,言高性能必称Iris.彩虹女神的名号响彻寰宇.名动江湖,单论一个快字,无人能出其右,就连以简洁轻量著称于世的Gin也难以望其项背,只见彩虹女神Ir ...

  7. 解决linux下U盘变成只读模式

    在最近的一个项目里,需要将linux下的些文件拷贝出来.插入U盘后,发现是只读模式. U盘可以写出,不能写入. 折腾了一翻: 最后这样解决的: 将U盘插入到windows下 执行 chkdsk g: ...

  8. iommu分析之---smmu v3的实现

    smmu 除了完成 iommu 的统一的ops 之外,有自己独特的一些地方. 1.Stream Table Stream Table是存在内存中的一张表,在SMMU设备初始化的时候由驱动程序创建好. ...

  9. i40e网卡驱动遇到的一个问题

    最近在排查一个crash文件的时候,遇到一个堆栈,即软中断收包的时候,skb的关联的dev是null,导致oops, 然后去crash分析的时候,发现skb的dev去不是null. 从oops到cra ...

  10. 【NOI P模拟赛】(要素过多的标题)(容斥原理)

    题面 0 题目背景 [ 数   据   删   除 ] _{^{[数\,据\,删\,除]}} [数据删除]​ 1 题目描述 在执行任务时,收集到了 n n n 份能源,其中第 i i i 份的能量值是 ...