【UOJ #221】【NOI 2016】循环之美
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]$$
化一波式子:
&\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】循环之美的更多相关文章
- [UOJ#221][BZOJ4652][Noi2016]循环之美
[UOJ#221][BZOJ4652][Noi2016]循环之美 试题描述 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k 进制下,一个数的小数部 ...
- [NOI 2016]循环之美
Description 题库链接 给出十进制下的 \(n,m,k\) ,求 \(\frac{i}{j},i\in[1,n],j\in[1,m]\) 在 \(k\) 进制下不同的纯循环小数个数. 纯循环 ...
- NOI 2016 循环之美 (莫比乌斯反演+杜教筛)
题目大意:略 洛谷传送门 鉴于洛谷最近总崩,附上良心LOJ链接 任何形容词也不够赞美这一道神题 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M}[gcd(i,j) ...
- UOJ #221 【NOI2016】 循环之美
题目链接:循环之美 这道题感觉非常优美--能有一个这么优美的题面和较高的思维难度真的不容易-- 为了表示方便,让我先讲一下两个符号.\([a]\)表示如果\(a\)为真,那么返回\(1\),否则返回\ ...
- [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分
[LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分 题意 给定一个字符串 \(S\), 求有多少种将 \(S\) 的子串拆分为形如 AABB 的拆分方案 \(| ...
- 【BZOJ4652】【NOI2016】循环之美(莫比乌斯反演,杜教筛)
[BZOJ4652]循环之美(莫比乌斯反演,杜教筛) 题解 到底在求什么呢... 首先不管他\(K\)进制的问题啦,真是烦死啦 所以,相当于有一个分数\(\frac{i}{j}\) 因为值要不相等 所 ...
- [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字
[LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...
- LibreOJ2085 - 「NOI2016」循环之美
Portal Description 给出\(n,m(n,m\leq10^9)\)和\(k(k\leq2000)\),求在\(k\)进制下,有多少个数值不同的纯循环小数可以表示成\(\dfrac{x} ...
- 「NOI2016」循环之美
P1587 [NOI2016]循环之美 题目描述 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 $k$ 进制下,一个数的小数部分是纯循环的,那么它就 ...
- 「NOI2016」循环之美 解题报告
「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足 ...
随机推荐
- OpenCV LIBTIFF_4.0 link errors
以前用Caffe用的好好的,今天重装后居然报了很多这样的错误 /usr/lib/libopencv_highgui.so.' 1> /usr/lib/libopencv_highgui.so.' ...
- spfa+差分约束系统(C - House Man HDU - 3440 )+对差分约束系统的初步理解
题目链接:https://cn.vjudge.net/contest/276233#problem/C 题目大意:有n层楼,给你每个楼的高度,和这个人单次的最大跳跃距离m,两个楼之间的距离最小是1,但 ...
- v8-su-root
1.下载userdebug版本 2.设置模块打开develop options 3.勾选usb debugging 4.adb remount 5.解压SuperSU_N.7z(联系我索取)并push ...
- 遍历 USB devcie,读取设备描述符 device descriptor【转】
转自:http://blog.csdn.net/flyyyri/article/details/5480347 理论: 对于USB接口的设备,现在越来越多了.本篇我们就通过获取一个USB扫描仪设 ...
- eclipse安装阿里代码扫描插件
1.首先打开eclipse软件,点击工具栏上的Help,选择Install New Soft进行安装新的插件. 2.进入插件安装界面,点击Add,弹出插件地址填写界面,也可以直接在市场上搜索关键字al ...
- C# 应用程序配置文件App.Config和web.config
应用程序配置文件,对于asp.net是 web.config,对于WINFORM程序是 App.Config(ExeName.exe.config). 配置文件,对于程序本身来说,就是基础和依据,其本 ...
- file.getPath() getAbsolutePath() getCanonicalPath()区别
package file; import java.io.File; import java.io.IOException; public class getFilePath { public sta ...
- 洛谷P1195口袋的天空
传送门啦 一个裸的最小生成树,输出 $ No Answer $ 的情况只有 $ k < n $ 的时候. 开始令 $ num =n $ ,如果 $ num = k $ ,直接输出 $ 0 $ , ...
- 关于UrlEncode 一团乱麻的问题,后续彻底理解。Java中的 URLEncoder 与 URLDecoder无bug
很多开放平台都是小白开发的,对这个urlencode理解的不到位,他们总是认为java官方的urlencode有bug,需要 URLEncoder.encode("Hello World&q ...
- Spring Boot使用JavaMailSender发送邮件
http://www.cnblogs.com/wxc-xiaohuang/p/9532631.html https://blog.csdn.net/icannotdebug/article/detai ...