「NOI2016」循环之美(小性质+min_25筛)
题解
感觉这题最难的是第一个结论。
数值上不等,所以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筛)的更多相关文章
- 「NOI2016」循环之美 解题报告
「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足 ...
- LibreOJ2085 - 「NOI2016」循环之美
Portal Description 给出\(n,m(n,m\leq10^9)\)和\(k(k\leq2000)\),求在\(k\)进制下,有多少个数值不同的纯循环小数可以表示成\(\dfrac{x} ...
- 「NOI2016」循环之美
P1587 [NOI2016]循环之美 题目描述 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 $k$ 进制下,一个数的小数部分是纯循环的,那么它就 ...
- *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 ...
- LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美
题目传送门:LOJ #2085. 两个月之前做的傻题,还是有必要补一下博客. 题意简述: 求分子为不超过 \(n\) 的正整数,分母为不超过 \(m\) 的正整数的所有互不相等的分数中,有多少在 \( ...
- 【LOJ】#2085. 「NOI2016」循环之美
题解 我们要求的其实是这个东西= = \(\sum_{i = 1}^{n}\sum_{j = 1}^{n}[(i,j) == 1][(j,k) == 1]\) 然后变一下形 \(\sum_{j = 1 ...
- UOJ#221. 【NOI2016】循环之美 数论,杜教筛
原文链接www.cnblogs.com/zhouzhendong/p/UOJ221.html 题解 首先把题目转化为求 \[\sum_{x=1}^n \sum_{y=1}^m [\gcd(x,y) = ...
- 「NOI2016」区间 解题报告
「NOI2016」区间 最近思维好僵硬啊... 一上来就觉得先把区间拆成两个端点进行差分,然后扫描位置序列,在每个位置维护答案,用数据结构维护当前位置的区间序列,但是不会维护. 于是想研究性质,想到为 ...
- 「NOI2016」优秀的拆分 解题报告
「NOI2016」优秀的拆分 这不是个SAM题,只是个LCP题目 95分的Hash很简单,枚举每个点为开头和末尾的AA串个数,然后乘一下之类的. 考虑怎么快速求"每个点为开头和末尾的AA串个 ...
随机推荐
- Java Thread之start和run方法的区别
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11421515.html start 用start方法来启动线程,真正实现了多线程运行,这时无需等待ru ...
- Python执行和拷贝
import paramiko from scp import SCPClient class LinuxSSHSCP(object): def __init__(self, ip, username ...
- js调用浏览器
定义和用法 open() 方法用于打开一个新的浏览器窗口或查找一个已命名的窗口. 语法 window.open(URL,name,specs,replace) 参数 说明 URL 可选.打开指定的页面 ...
- 【leetcode】976. Largest Perimeter Triangle
题目如下: Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero ...
- 【leetcode】925.Long Pressed Name
题目如下: Your friend is typing his name into a keyboard. Sometimes, when typing a character c, the key ...
- 轻松解决U盘拷贝文件时提示文件过大问题
现在的高科技时代生活中,u盘的使用已经是许多从事电脑it行业的人每天都必须要用到的用具.可以在一台电脑上使用u盘拷贝文件到另外一台电脑上进行使用,加上它的身材小巧,非常方便我们随身携带到任何地方进行使 ...
- nginx添加一个server
nginx添加一个server server { listen 80; server_name dev.pccb.com; index index.html index.htm; # rewrite ...
- [CSP模拟测试43、44]题解
状态极差的两场.感觉现在自己的思维方式很是有问题. (但愿今天考试开始的一刻我不会看到H I J) A 考场上打了最短路+贪心,水了60. 然而正解其实比那30分贪心好想多了. 进行n次乘法后的结果一 ...
- 项目质量管理—七种基本质量工具
出处:PMBOK(第五版) P236 1.因果图,又称鱼骨图或石川图 用来追溯问题来源,回推到可行动的根本原因.(找根本原因) 2.流程图,也称过程图 用来显示在一个或多个输入转化成一个或多个输出的过 ...
- java并发编程笔记(五)——线程安全策略
java并发编程笔记(五)--线程安全策略 不可变得对象 不可变对象需要满足的条件 对象创建以后其状态就不能修改 对象所有的域都是final类型 对象是正确创建的(在对象创建期间,this引用没有逸出 ...