传送门.

题解


感觉这题最难的是第一个结论。

数值上不等,所以x/y首先要互质,然后如果在10进制是纯循环小数,不难想到y不是2、5的倍数就好了。

因为十进制下除以2和5是除得尽的。

必然会多出来的什么东西。

如果是k进制,可以类比得\(gcd(y,k)=1\)。

证明:

假设纯循环的位数是\(l\)

则\(x*k^l\equiv x(mod~y)\)

\(k^l\equiv 1(mod~y)\)

要存在\(l\)的话,就必须有\(gcd(k,y)=1\),反过来一样。

反演:

\(Ans=\sum_{i=1}^n\sum_{j=1}^m[(i,j)=1]*[(j,k)=1]\))

\(\sum_{d=1}^{min(n,m)} \mu(d)*[gcd(d,k)=1]*(n/d)*\sum_{j=1}^{m/d}[gcd(j,k)=1]\)

如果能解决前面的前缀和问题,后面的分块后容斥或者说预处理O(1)都不是问题。

然后你发现前面是个积性函数,而且是可以min_25筛的积性函数,不过要筛个两遍。

就没了……

Code:


#include<bits/stdc++.h>
#define fo(i, x, y) for(int i = x, B = y; i <= B; i ++)
#define ff(i, x, y) for(int i = x, B = y; i < B; i ++)
#define fd(i, x, y) for(int i = x, B = y; i >= B; i --)
#define ll long long
#define pp printf
#define hh pp("\n")
using namespace std; int k; int d[20], d0; void fen(int x) {
for(int i = 2; i * i <= x; i ++) if(x % i == 0) {
d[++ d0] = i;
while(x % i == 0) x /= i;
}
if(x > 1) d[++ d0] = x;
} namespace m25 {
const int N = 2e5 + 5;
int n, sq;
int w[N], w0, i1[N], i2[N];
int p[N], p0, bz[N]; void sieve(int n) {
fo(i, 2, n) {
if(!bz[i]) p[++ p0] = i;
for(int j = 1; i * p[j] <= n; j ++) {
int k = i * p[j];
bz[k] = 1; if(i % p[j] == 0) break;
}
}
} int g[N];
#define num(x) ((x) <= sq ? i1[x] : i2[n / (x)]) int sp[N]; void build() {
sq = sqrt(n); sieve(sq);
for(int i = 1, j; i <= n; i = j + 1) {
j = n / (n / i);
w[++ w0] = n / i;
if(w[w0] <= sq) i1[w[w0]] = w0; else i2[i] = w0;
g[w0] = w[w0] - 1;
}
fo(j, 1, p0) for(int i = 1; p[j] * p[j] <= w[i] && i <= w0; i ++) {
int k = num(w[i] / p[j]);
g[i] -= (g[k] - (j - 1));
}
int l = 0;
fd(i, w0, 1) {
while(l < d0 && d[l + 1] <= w[i]) l ++;
g[i] -= l;
}
fo(i, 1, w0) g[i] = -g[i];
fo(i, 1, p0) sp[i] = sp[i - 1] - (k % p[i] != 0);
for(int j = p0; j >= 1; j --) if(k % p[j]) for(int i = 1; p[j] * p[j] <= w[i] && i <= w0; i ++) {
int k = num(w[i] / p[j]);
g[i] += (g[k] - sp[j]) * -1;
}
fo(i, 1, w0) g[i] ++;
} ll q1(int x) {
return g[num(x)];
}
}
using m25 :: q1; namespace m26 {
const int N = 2e5 + 5;
int n, sq;
int w[N], w0, i1[N], i2[N];
int p[N], p0, bz[N]; void sieve(int n) {
fo(i, 2, n) {
if(!bz[i]) p[++ p0] = i;
for(int j = 1; i * p[j] <= n; j ++) {
int k = i * p[j];
bz[k] = 1; if(i % p[j] == 0) break;
}
}
} int g[N];
#define num(x) ((x) <= sq ? i1[x] : i2[n / (x)]) int sp[N]; void build() {
sq = sqrt(n); sieve(sq);
for(int i = 1, j; i <= n; i = j + 1) {
j = n / (n / i);
w[++ w0] = n / i;
if(w[w0] <= sq) i1[w[w0]] = w0; else i2[i] = w0;
g[w0] = w[w0] - 1;
}
fo(j, 1, p0) for(int i = 1; p[j] * p[j] <= w[i] && i <= w0; i ++) {
int k = num(w[i] / p[j]);
g[i] -= (g[k] - (j - 1));
}
int l = 0;
fd(i, w0, 1) {
while(l < d0 && d[l + 1] <= w[i]) l ++;
g[i] -= l;
}
fo(i, 1, w0) g[i] = -g[i];
fo(i, 1, p0) sp[i] = sp[i - 1] - (k % p[i] != 0);
for(int j = p0; j >= 1; j --) if(k % p[j]) for(int i = 1; p[j] * p[j] <= w[i] && i <= w0; i ++) {
int k = num(w[i] / p[j]);
g[i] += (g[k] - sp[j]) * -1;
}
fo(i, 1, w0) g[i] ++;
}
ll q2(int x) {
return g[num(x)];
}
}
using m26 :: q2; int n, m; struct P {
int x, y;
} t[1024]; int t0; void dg(int x, int y, int z) {
if(x > d0) {
t[++ t0] = (P) {y, z};
return;
}
dg(x + 1, y, z);
dg(x + 1, y * d[x], -z);
} int cmp(P a, P b) { return a.x < b.x;} void query() {
ll ans = 0;
int lc = 0, c = 0;
for(int i = 1, j; i <= min(n, m); i = j + 1) {
int m1 = n / (n / i), m2 = m / (m / i);
if(m1 < m2) {
j = m1, c = 0;
} else {
j = m2, c = 1;
}
ll s = !c ? q1(j) : q2(j);
if(i > 1) s -= !lc ? q1(i - 1) : q2(i - 1);
lc = c;
ll s2 = 0;
fo(u, 1, t0) if(t[u].x <= m / i) s2 += t[u].y * (m / i / t[u].x);
ans += s * (n / i) * s2;
}
pp("%lld", ans);
} int main() {
scanf("%d %d %d", &n, &m, &k);
fen(k);
m25 :: n = n;
m25 :: build();
m26 :: n = m;
m26 :: build();
dg(1, 1, 1);
sort(t + 1, t + t0 + 1, cmp);
query();
}

「NOI2016」循环之美(小性质+min_25筛)的更多相关文章

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

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

  2. LibreOJ2085 - 「NOI2016」循环之美

    Portal Description 给出\(n,m(n,m\leq10^9)\)和\(k(k\leq2000)\),求在\(k\)进制下,有多少个数值不同的纯循环小数可以表示成\(\dfrac{x} ...

  3. 「NOI2016」循环之美

    P1587 [NOI2016]循环之美 题目描述 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 $k$ 进制下,一个数的小数部分是纯循环的,那么它就 ...

  4. *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 ...

  5. LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美

    题目传送门:LOJ #2085. 两个月之前做的傻题,还是有必要补一下博客. 题意简述: 求分子为不超过 \(n\) 的正整数,分母为不超过 \(m\) 的正整数的所有互不相等的分数中,有多少在 \( ...

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

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

  7. UOJ#221. 【NOI2016】循环之美 数论,杜教筛

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ221.html 题解 首先把题目转化为求 \[\sum_{x=1}^n \sum_{y=1}^m [\gcd(x,y) = ...

  8. 「NOI2016」区间 解题报告

    「NOI2016」区间 最近思维好僵硬啊... 一上来就觉得先把区间拆成两个端点进行差分,然后扫描位置序列,在每个位置维护答案,用数据结构维护当前位置的区间序列,但是不会维护. 于是想研究性质,想到为 ...

  9. 「NOI2016」优秀的拆分 解题报告

    「NOI2016」优秀的拆分 这不是个SAM题,只是个LCP题目 95分的Hash很简单,枚举每个点为开头和末尾的AA串个数,然后乘一下之类的. 考虑怎么快速求"每个点为开头和末尾的AA串个 ...

随机推荐

  1. iSkysoft iMedia Converter Deluxe for Mac的使用方法

    我们电脑上的播放器大多数的播放格式都比较少,所以在播放其它格式的时候容易出错,不能兼容其它的视频格式.今天小编要给大家推荐一种软件,iSkysoft iMedia Converter Deluxe就是 ...

  2. java基础学习笔记六(继承)

    继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父 ...

  3. Eur yml

    server: port: 6001 # 服务端口 eureka: instance: hostname: localhost # eureka服务端的实例名称 client: registerWit ...

  4. CF1061E Politics E. Politics 解题报告

    CF1061E Politics E. Politics 考虑利用树的性质,因为是子树问题,所以放到dfs序上. 只考虑一个树,问题是每个区间选恰好\(k\)个.因为区间其实是子树,所以区间要么包含, ...

  5. centos下mysql密码修改与远程连接

    之前的服务器,好久没上去过了,今天上去,密码居然又忘了... 要修改mysql的登陆密码,首先要设置 #vim /etc/my.cnf 在[mysqld] 下面加上一句 skip-grant-tabl ...

  6. CDN技术之--内容缓存工作原理

    有CDN前的网站服务技术–硬件扩展:高成本,灵活性和可扩展性比较差–镜像技术(mirroring):镜像服务器安装有一个可以进行自动远程备份的软件,每隔一定时间,各个镜像服务器就会到网站的源服务器上去 ...

  7. ecshop整合discuz教程完美教程

    所需软件: ecshop安装包:    ECShop_V2.7.3_UTF8_release1106.rarucenter安装包:   UCenter_1.6.0_SC_UTF8.zipdiscuz! ...

  8. Docker Machine 管理-管理machine(17)

    用 docker-machine 创建 machine 的过程很简洁,非常适合多主机环境.除此之外,Docker Machine 也提供了一些子命令方便对 machine 进行管理.其中最常用的就是无 ...

  9. Centos6.6部署Redis集群

    Centos6.6部署Redis集群 1环境准备 1环境安装redis 1安装ruby 2配置redis主从环境 3部署redis sentinel服务器 5集群使用 13当前集群环境说明 13测试功 ...

  10. Qt获取文件路径、文件夹路径

    1.首先是选择文件 QString file_path = QFileDialog::getOpenFileName(this, "请选择文件路径...", "默认路径( ...