题目连接:

  传送

题解:

  真是一道好题……

一:

  一个分数$\frac{x}{y}$完全循环当其第一次出现时,当且仅当y与k互质,x与y互质,且y不等于1。

  整数情况下y一定为1,即也满足以上判断。

  推导:

    方法一:打表找规律= =

    方法二:x与y互质去重= =,设循环次数为l,则对于循环节第一次循环前剩余$x\mod y$,第二次循环前剩余$xk^l\mod y$,若其为循环则满足:,由x与y互质可知存在x对y的逆元,所以:

        

由贝祖定理可知,k与y互质。

二、反演:

          

  考虑d前面时间复杂度为$O(\sqrt{k}\ln k)$,后边分块时间复杂度$O(\sqrt n)$

  考虑如何得到$S(n,sg)=\sum_{i=1}^n \mu(isg)$。

  1.当$\mu(sg)==0$时,上式为0;

  2.设p为sg质因数,则有$S(n,sg)=\sum_{i=1}^n\mu(i)([p|i]-1)$,故$S(n,sg)=S(n/p,sg)-S(n,sg/p)$。

  故求一次$S(n,sg)$的时间复杂度约为$(O(2^{k的质因子个数}))$。

三、时间复杂度

  $O(\sqrt{nk}\ln k)$  

代码:

 #include "bits/stdc++.h"

 using namespace std;

 const int N=2e7+;

 int prim[N],num,miu[N],pre[N];
bool vis[N]; inline void init(){
miu[]=;
pre[]=;
register int i,j;
for( i=;i<N;++i){
if(!vis[i])
prim[++num]=i,miu[i]=-;
for( j=;prim[j]*i<N;++j){
vis[i*prim[j]]=true;
if(i%prim[j]) {
miu[i*prim[j]]=-miu[i];
}else{
miu[i*prim[j]]=;break;
}
}
pre[i]+=pre[i-]+miu[i];
}
} int n,m,k,wr[N],cnt;
int fac[][];
vector<int> factor[]; map<int,int> ss; inline int Get_miu(int x){
if(x<N) return pre[x];
if(ss.count(x)) return ss[x];
int ans=;
for(int i=,pos;i<=x;i=pos+){
pos=x/(x/i);
ans-=Get_miu(x/i)*(pos-i+);
}
return ss[x]=ans;
} inline int get_miu(int x,int sg){
if(sg==)return Get_miu(x);
if(x<=) return fac[sg][x];
else {
int p=wr[sg];
return get_miu(x/p,sg)-get_miu(x,sg/p);
}
} int main(){
// freopen("1.out","r",stdin);
// freopen("b1.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
init();
for(int i=;i<=k;++i)
for(int j=;j<=i;++j)
if(i%j==) factor[i].push_back(j); for(int i=;i<=;++i)
for(int j=;prim[j]<=i;++j) if(i%prim[j]==) wr[i]=prim[j];
for(int i=;i<=;++i)
if(k%i==)
for(int j=;j<=;++j)
fac[i][j]=fac[i][j-]+miu[j*i]; long long ans=,sum;
register int d,pos;
int last,now,nn,mm,t1,t2,t,g,s,p,q;
for(int i=;i<factor[k].size();++i){
t=factor[k][i];
sum=;
for( p=;p<factor[t].size();++p){
g=factor[t][p];
for( q=,s;q<factor[t/g].size();++q){
s=factor[t/g][q];
t1=s*g,t2=s*t;
nn=n/t1,mm=m/t2;
last=,now;
if(miu[s*g]==) continue;
for(d=,pos;d<=min(nn,mm);d=pos+){
pos=min(nn/(nn/d),mm/(mm/d));
now=get_miu(pos,s*g);
sum+=(now-last)*1ll*(nn/d)*(mm/d)*miu[s];
last=now;
}
}
}
ans+=sum*miu[t];
}
printf("%lld\n",ans);
}

【BZOJ 4652】【NOI 2016】循环之美的更多相关文章

  1. [NOI 2016]循环之美

    Description 题库链接 给出十进制下的 \(n,m,k\) ,求 \(\frac{i}{j},i\in[1,n],j\in[1,m]\) 在 \(k\) 进制下不同的纯循环小数个数. 纯循环 ...

  2. NOI 2016 循环之美 (莫比乌斯反演+杜教筛)

    题目大意:略 洛谷传送门 鉴于洛谷最近总崩,附上良心LOJ链接 任何形容词也不够赞美这一道神题 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{M}[gcd(i,j) ...

  3. [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分

    [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分 题意 给定一个字符串 \(S\), 求有多少种将 \(S\) 的子串拆分为形如 AABB 的拆分方案 \(| ...

  4. [bzoj 4650][NOI 2016]优秀的拆分

    传送门 Description 如果一个字符串可以被拆分为\(AABB\) 的形式,其中$ A$和 \(B\)是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串\(aabaaba ...

  5. UOJ #221 【NOI2016】 循环之美

    题目链接:循环之美 这道题感觉非常优美--能有一个这么优美的题面和较高的思维难度真的不容易-- 为了表示方便,让我先讲一下两个符号.\([a]\)表示如果\(a\)为真,那么返回\(1\),否则返回\ ...

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

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

  7. LibreOJ2085 - 「NOI2016」循环之美

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

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

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

  9. [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机

    [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...

  10. [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会

    [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会 题意 给定一个长度为 \(n\) 的字符串 \(s\), 对于所有 \(r\in[1,n]\) 求出 \(s\ ...

随机推荐

  1. mysql-proxy中的admin-lua-script

    [root@ecs-7b55 lua]# cat admin.lua --[[ $%BEGINLICENSE%$ Copyright (c) 2008, 2012, Oracle and/or its ...

  2. VS Code python初体验笔记

    之前一直都是使用Notepad++来编写Python代码,后来想起来之前查资料的时候有个VS Code可以编写一些的脚本语言(js,node.js)甚至是高级编程语言(C#,PHP,JAVA,Pyth ...

  3. Python 3.7 将引入 dataclass 装饰器

    简评:Python 3.7 将于今年夏天发布,Python 3.7 中将会有许多新东西,最激动人心的新功能之一是 dataclass 装饰器. 什么是 Data Class 大多数 Python 开发 ...

  4. unity 代码C#封装为dll

    1  Visual studio软件打开后创建一个项目 2并选择类库类型 3编写简单的代码看看效果(发现会报错),主要是没有添加类库,以及using UnityEngine;引用空间 4添加类库,引用 ...

  5. poi excel 常用操作

    基本 Workbook wb= new HSSFWorkbook(); Sheet sheet = wb.createSheet("sheetName"); Row row = s ...

  6. 点击劫持漏洞之理解 python打造一个挖掘点击劫持漏洞的脚本

    前言: 放假了,上个星期刚刚学习完点击劫持漏洞.没来的及写笔记,今天放学总结了一下 并写了一个检测点击劫持的脚本.点击劫持脚本说一下哈.= =原本是打算把网站源码 中的js也爬出来将一些防御的代码匹配 ...

  7. mysql统计类似SQL语句查询次数

    mysql统计类似SQL语句查询次数 vc-mysql-sniffer 工具抓取的sql分析. 1.先用shell脚本把所有enter符号替换为null,再根据语句前后的字符分隔语句 grep -Ev ...

  8. Spring Framework 5 中的新特性

    https://www.ibm.com/developerworks/cn/java/j-whats-new-in-spring-framework-5-theedom/index.html Spri ...

  9. Google搜索排名优化-面向搜索引擎的网站设计

    内容摘要:网站在搜索营销方面最主要的缺点: 行业知识:不知道搜索引擎对吸引的新用户的重要性,在搜索引擎排名服务中追求“傻瓜相关”,购买一些其实没有太多实际意义的行业关键词.其实能够用户输入的关键词越多 ...

  10. 了解与建设有中国特色的Android M&N(Android6.0和7.0新特性分析)

    http://geek.csdn.NET/news/detail/110434 Android N已经发布有段时间,甚至马上都要发布android 7.1,相信不少玩机爱好者已经刷入最新的Androi ...