原题链接
好妙的一道神仙题

题目大意

让你求在$k$进制下,\(\frac{x}{y}\)(\(x\in [1,n],y\in [1,m]\))中有多少个最简分数是纯循环小数

SOLUTION

首先查一下资料,你会发现在十进制下,一个分数是纯循环小数的充要条件是分母的质因子中不含$2$和$5$。因为$10=2\times 5$,于是我们猜在$k$进制下只要分母与$k$互质即可
orz,猜对了!但是怎么证明呢?
先在十进制下考虑,看一下题目给的提示,可以知道那些余数其实是$x\ mod\ y$,$10x\ mod\ y$,$102x\ mod\ y$...,余数出现重复,表明如下同余方程有解:
$$10
lx\equiv x(mod\ y)$$
又因为$gcd(x,y)=1$,所以$10^l\equiv 1(mod\ y)$,然后可以得出$gcd(y,10)=1$
在$k$进制下同理

于是题目可以等价成让我们求这个式子的值(分数线默认向下取整)
\(\sum\limits_{x=1}^{n}\sum\limits_{y=1}^{m}[gcd(x,y)=1][gcd(y,k)=1]\)
两个和号并一起太丑了,先分开
\(=\sum\limits_{y=1}^{m}[gcd(y,k)=1]\sum\limits_{x=1}^{n}[gcd(x,y)=1]\)
上个莫比乌斯反演
\(=\sum\limits_{y=1}^{m}[gcd(y,k)=1]\sum\limits_{x=1}^{n}\sum\limits_{d|x,d|y}\mu (d)\)
把$d$往前提
\(=\sum\limits_{d=1}^{min(n,m)}\mu (d)\sum\limits_{d|x}^{n}\sum\limits_{d|y}^{m}[gcd(y,k)=1]\)
\(=\sum\limits_{d=1}^{min(n,m)}[gcd(d,k)=1]\mu (d)\sum\limits_{x=1}^{\frac{n}{d}}\sum\limits_{y=1}^{\frac{m}{d}}[gcd(y,k)=1]\)
\(=\sum\limits_{d=1}^{min(n,m)}[gcd(d,k)=1]\mu (d)\frac{n}{d}\sum\limits_{y=1}^{\frac{m}{d}}[gcd(y,k)=1]\)
因为$k$只有$2000$,所以后面那个和号可以预处理一下然后$O(1)$的求。大概就是设$g(n)=\sum\limits_[gcd(i,k)=1]$,同时有$g(n)=\fracg(k)+g(n\ mod\ k)$,只需要预处理到$g_k$就好了
主要是前面的这一部分,推导过程参考自yyb

\(f(n,k)=\sum\limits_{d=1}^{n}[gcd(d,k)=1]\mu (d)\)
\(=\sum\limits_{d=1}^{n}\mu (d)\sum\limits_{i|d,i|k}\mu (i)\)
\(=\sum\limits_{i|k}\mu (i)\sum\limits_{d=1}^{\frac{n}{i}}\mu (id)\)
然后一波天秀的操作(用到了$\mu$函数的定义和它的积性)
\(=\sum\limits_{i|k}\mu (i)\sum\limits_{d=1,gcd(d,i)=1}^{\frac{n}{i}}\mu (d)\mu (i)\)
\(=\sum\limits_{i|k}\mu (i)^2\sum\limits_{d=1}^{\frac{n}{i}}[gcd(d,i)=1]\mu (d)\)
\(=\sum\limits_{i|k}\mu (i)^2f(\frac{n}{i},i)\)
然后就可以愉快地递归加个记忆化了,但是边界稍微有点麻烦:
当$n\leqslant 1$或$k=1$时,它等于$\sum\limits_
\mu (d)$,而$n$最大可能有$10^9$,所以需要上一个杜教筛
回到这个式子
\(\sum\limits_{d=1}^{min(n,m)}[gcd(d,k)=1]\mu (d)\frac{n}{d}\sum\limits_{y=1}^{\frac{m}{d}}[gcd(y,k)=1]\)
把后面用$g$替换,得到
\(=\sum\limits_{d=1}^{min(n,m)}[gcd(d,k)=1]\mu (d)\frac{n}{d}g(\frac{m}{d})\)
发现是一个二维整除分块的形式,然后就没了
代码,用了一点小优化:

#include <bits/stdc++.h>

using namespace std;

#define pii pair<int, int>
#define mp make_pair
#define ll long long
#define MAXN 1000000
#define MAXK 2000 int n, m, k;
int prime[MAXN + 5], mu[MAXN + 5], sum[MAXN + 5], cnt, g0[MAXK + 5];
bool vis[MAXN + 5];
map<int, int> m1;
map<ll, int> m2; int gcd(int x, int y) {
return !y ? x : gcd(y, x % y);
} void init() {
mu[1] = sum[1] = 1;
vis[1] = true;
for (int i = 2; i <= MAXN; ++i) {
if (!vis[i]) prime[++cnt] = i, mu[i] = -1;
for (int j = 1; j <= cnt && i * prime[j] <= MAXN; ++j) {
vis[i * prime[j]] = true;
if (i % prime[j] == 0) break;
else mu[i * prime[j]] = -mu[i];
}
sum[i] = mu[i] + sum[i - 1];
}
for (int i = 1; i <= k; ++i) g0[i] = g0[i - 1] + (gcd(i, k) == 1);
} int getsum(int n) {
if (n <= MAXN) return sum[n];
else if (m1.count(n)) return m1[n];
int ret = 1;
for (int l = 2, r; l <= n; l = r + 1) {
r = n / (n / l);
ret -= (r - l + 1) * getsum(n / l);
}
return m1[n] = ret;
} int f(int n, int k) {
if (k == 1 || n <= 1) return getsum(n);
else if (m2.count(3000LL * n + k)) return m2[3000LL * n + k];
int ret = 0;
for (int i = 1; i <= k; ++i) {
if (k % i) continue;
if(mu[i]) ret += mu[i] * mu[i] * f(n / i, i); // 优化,如果mu[i]是0就不需要递归了
}
return m2[3000LL * n + k] = ret;
} int g(int n) {
return n / k * g0[k] + g0[n % k];
} int main() {
scanf("%d%d%d", &n, &m, &k);
init();
int lim = min(n, m);
ll ans = 0;
for (int l = 1, r; l <= lim; l = r + 1) {
r = min(n / (n / l), m / (m / l));
ans += 1LL * (f(r, k) - f(l - 1, k)) * (n / l) * g(m / l);
}
printf("%lld\n", ans);
return 0;
}

[NOI2016]循环之美——结论+莫比乌斯反演的更多相关文章

  1. BZOJ4652 NOI2016循环之美(莫比乌斯反演+杜教筛)

    因为要求数值不同,不妨设gcd(x,y)=1.由提示可以知道,x/y是纯循环小数的充要条件是x·klen=x(mod y).因为x和y互质,两边同除x,得klen=1(mod y).那么当且仅当k和y ...

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

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

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

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

  4. luogu 1587 [NOI2016]循环之美

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

  5. [NOI2016]循环之美

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

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

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

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

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

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

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

  9. bzoj4652 [Noi2016]循环之美

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

随机推荐

  1. mysql 触发器检测表数据添加,进而调用存储过程检测数据,进而调用存储过程添加数据

    触发器: beginDECLARE user_mes INT(64);SELECT user_id into user_mes FROM order_orderlist where id = new. ...

  2. 论文翻译:Conditional Random Fields as Recurrent Neural Networks

    Conditional Random Fields as Recurrent Neural Networks ICCV2015    cite237 1摘要: 像素级标注的重要性(语义分割 图像理解) ...

  3. 亿级Web系统搭建――单机到分布式集群 转载

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  4. oracle不记得所有账户和密码怎么办

    1.打开cmd,输入sqlplus /nolog,回车: 2.输入“conn / as sysdba”; 3.输入“alter user sys identified by 新密码:”,注意:必须输入 ...

  5. 什么是大数据计算服务MaxCompute

    大数据计算服务(MaxCompute,原名ODPS)是一种快速.完全托管的EB级数据仓库解决方案. 当今社会数据收集手段不断丰富,行业数据大量积累,数据规模已增长到了传统软件行业无法承载的海量数据(百 ...

  6. docker服务端与客户端通信方式

    docker的服务端与客户端间可以通过unix.tcp方式进行通信.但默认情况下,服务端只监听本地unix接口/var/run/docker.sock,所以客户端只能在服务端所在的机器上使用该unix ...

  7. Devexpress xaf BO中字段为RuleRequiredField必输字段时,文本标签默认添加*标记

    BO中字段为RuleRequiredField必输字段时,文本标签默认添加*标记.需要在模型编辑器中设置,如图. 官网地址:https://docs.devexpress.com/eXpressApp ...

  8. Ansible 自动化工具入门

    Ansible 配置 Ansible 简单管理 下面的小实验,我们将采用以下的IP地址规划,请自行配置好. [实验环境] [状态] [主机列表] [python版本] 控制机 192.168.1.10 ...

  9. POJ 1860 汇率 SPFA

    题意 有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 ...

  10. python经典小程序集锦(一) 实现九九乘法表

    本篇文章主要是收集整理一些小程序以供大家娱乐,或者是在面试的时候使用到.文章会持续更新,希望大家收藏关注哦. 1.代码实现过程 for i in range(1, 10): for j in rang ...