LINK:NOI2016循环之美

这道题是 给出n m k 求出\(1\leq i\leq n,1\leq j\leq m\) \(\frac{i}{j}\)在k进制下是一个纯循环的。

由于数值相同的分数不能记录 所以 \((i,j)==1\) 对于是一个纯循环的数我们先从最熟悉的10进制下说起。

可以发现\(\frac{1}{7},\frac{1}{13}\)等等都是纯循环的 而\(\frac{1}{6},\frac{1}{4}\)等等非纯循环。

于是可以发现 当j和10互质的时候此时是纯循环。不妨证明这一点。

当 j和10互质的时候 可以发现j和10没有共有的因子所以\(10^w\)在mod j的情况下是有循环的。这类似于完全剩余系。

当j和10不互质 时 显然可以发现 前半部分时非循环后半部分由于因数被消掉之后 剩下和10互质的数 所以后半部分时一个循环 但此时已经不满足条件了。

从10 我们发现一个有意思的时候 那就是我们好像可以推广到K进制 在K进制下也是一个纯循环的数当且仅当 j在K进制下和K互质。

举个例子 在5进制下 \(\frac{3}{4}\) 4和5 互质 而且你可以自己手算一下这个结果是0.33333333 在5进制下。

说明我们假设成立。(考场上还是要靠猜的。

但是这样求还是很困难 因为j在K进制下和K互质 nm暴力之外还要把 j转成K进制 还要再求gcd 这着实优化不了。

O(m)暴力我们都T掉了。

考虑两个数字互质有 (a,b)==1 在K进制下 \((...+p_1k^1+p_0k^0,...+b_1k^1+b_0k^0)\)这个东西gcd会是多少呢

我猜测是1 /cy 通过不断的打表发现是正确的。于是不考虑证明我们得到这样的一个式子。

题目要求的是 \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[(i,j)=1][(j,k)=1]\)

随便变型一下:\(\sum\limits_{i=1}^{n}\sum\limits_{j=1,且(j,k)=1}^{m}\sum_{d|i,d|j}\mu(d)\)

\(\to \sum_{d=1}^{n}\mu(d)\frac{n}{d}\sum_{j=1}^{\frac{m}{d}}[(jd,k)=1]\)

你发现都推到这里了 还是很难求。

但是到了这个地方再把互质的条件进行反演会非常繁杂。

一般到这个时候直接整除分块。所以我们只需要考虑 \(\sum_{d=1}^{n}[(d,k)=1]\mu(d)\)这个东西和\(\sum_{j=1}^{\frac{m}{d}}[(j,k)=1]\)的前缀和即可。

先考虑后面 设函数g(x)表示 \(\sum_{i=1}{x}[(i,k)=1]\) 那么\(g(x)=\frac{x}{k}g(k)+g(x\mod k)\)

那么预处理g函数很简单 O(k)枚举暴力算即可。

考虑前面那个东西的前缀和 \(S(n,k)=\sum_{d=1}^{n}\mu(d)[(d,k)=1]\)

这个时候没有什么办法化简了 而直接求是复杂度很高。

反演一下 \(S(n,k)=\sum_{d=1}^{n}\mu(d)\sum_{x|d,x|k}\mu(x)\)

\(S(n,k)=\sum_{x|k}\mu(x)\sum_{d=1}{\frac{n}{x}}\mu(xd)\)

这个时候 看起来没办法化简了 但是其实我们观察一下\(\mu(xd)\) \((x,d)\neq 1\)时 对答案才有贡献。

由积性函数可得 \(S(n,k)=\sum_{x|k}\mu(x)\sum_{d=1}{\frac{n}{x}}\mu(d)\mu(x)[(x,d)=1]\)

根据我们S函数的定义可得 \(\sum_{d=1}{\frac{n}{x}}\mu(d)\mu(x)[(x,d)=1]\)

所以总式子为\(S(n,k)=\sum_{x|k}\mu(x)^2 S(\frac{n}{x},d)\)

所以这个S函数可以递归的算出来 我们利用map存起来来加快速度 对于mu(x)==0的可以不算。

显然递归边界为x==1 这个时候观察原式 其实式求\(\mu(x)\)的前缀和。

所以我们杜教筛一下。这样就可以求了。注意求S的时候也要开map来加速 还需要判断一下边界什么的。

复杂度?关于S的求出我并不会 分析复杂度。

const int MAXN=5000010,maxn=2010;
int n,m,k,top,maxx=5000000;
int mu[MAXN],p[MAXN],v[MAXN],g[maxn],w[MAXN];
inline int gcd(int a,int b){return b?gcd(b,a%b):a;}
map<int,int>H;map<pii,ll>s;
inline void prepare()
{
rep(1,k,i){g[i]+=g[i-1];if(gcd(i,k)==1)++g[i];}
mu[1]=1;
rep(2,maxx,i)
{
if(!v[i])
{
p[++top]=v[i]=i;
mu[i]=-1;
}
rep(1,top,j)
{
if(maxx/i<p[j])break;
v[i*p[j]]=p[j];
if(v[i]==p[j])break;
mu[i*p[j]]=-mu[i];
}
}
rep(1,maxx,i)w[i]+=w[i-1]+mu[i];
}
inline int djs(int x)
{
if(x<=maxx)return w[x];
if(H.find(x)!=H.end())return H[x];
int ans=1;
int w,ww;
for(int i=2;i<=x;i=ww+1)
{
w=x/i;ww=x/w;
ans-=(ww-i+1)*djs(w);
}
H[x]=ans;return ans;
}
inline ll S(int n,int k)
{
if(k==1)return djs(n);
if(n==1)return 1;
if(!n)return 0;
if(s.find(mk(n,k))!=s.end())return s[mk(n,k)];
ll ans=0;
for(int i=1;i*i<=k;++i)
{
if(k%i==0)
{
if(mu[i])ans=ans+S(n/i,i);
if(mu[k/i]&&i*i!=k)ans=ans+S(n/(k/i),k/i);
}
}
s[mk(n,k)]=ans;
return ans;
}
inline ll G(ll x){return x/k*g[k]+g[x%k];}
int main()
{
//freopen("1.in","r",stdin);
get(n);get(m);get(k);
prepare();
int w1,w2,ww;
ll ans=0;
int cc=min(n,m);
for(RE int i=1;i<=cc;i=ww+1)
{
w1=n/i;w2=m/i;
ww=min(n/w1,m/w2);
ans=ans+w1*(S(ww,k)-S(i-1,k))*G(w2);
}
printf("%lld\n",ans);
return 0;
}

luogu 1587 [NOI2016]循环之美的更多相关文章

  1. luogu P1587 [NOI2016]循环之美

    传送门 首先要知道什么样的数才是"纯循环数".打表可以发现,这样的数当且仅当分母和\(k\)互质,这是因为,首先考虑除法过程,每次先给当前余数\(*k\),然后对分母做带余除法,那 ...

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

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

  3. bzoj4652 [Noi2016]循环之美

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

  4. [NOI2016]循环之美

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

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

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

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

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

  7. 洛谷P1587 [NOI2016]循环之美

    传送门 不会,先坑着 https://kelin.blog.luogu.org/solution-p1587 //minamoto #include<cstdio> #include< ...

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

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

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

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

随机推荐

  1. UiAutomator源码学习(1)-- UiDevice

    UiDevice提供对设备状态信息的访问. 也可以使用此类来模拟设备上的用户操作,例如按键盘或按Home和Menu按钮.UiDevice类的完整源码 UiDevice.java 废话不多说,我们首先根 ...

  2. SSTI-服务端模板注入

    SSTI-服务端模板注入漏洞 原理: 服务端模板注入是由于服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而导致了敏感信息泄露. ...

  3. 开源导入导出库Magicodes.IE 多sheet导入教程

    原文作者:tanyongzheng 多Sheet导入教程 说明 本教程主要说明如何使用Magicodes.IE.Excel完成多个Sheet数据的Excel导入. 要点 多个相同格式的Sheet数据导 ...

  4. java动态代理基本原理及proxy源码分析一

    本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的态度,于是对java动态代理的本质原理做了一些研究,于是便有了这个系列的文章 为了尽快进入正题,这里 ...

  5. 大型Java进阶专题(七) 设计模式之委派模式与策略模式

    前言 ​ 今天开始我们专题的第七课了.本章节将介绍:你写的代码中是否觉得很臃肿,程序中有大量的if...else,想优化代码,精简程序逻辑,提升代码的可读性,这章节将介绍如何通过委派模式.策略模式让你 ...

  6. php 修改图片大小

    <?php set_time_limit(0);ini_set("memory_limit","500M");$dir = dir('./');while ...

  7. 安装FeedReader添加RSS订阅

    #0x1 FeedReader FeedReader是一款功能齐全,界面优美的GTK+ 3RSS阅读器客户端,用于在线RSS服务. FeedReader目前支持Feedbin,Feedly,Fresh ...

  8. requests接口自动化9-共享session和传递cookie

    前言: session:用requests.session()创建会话,可以将会话信息传递给其他接口 cookie:用RequestsCookieJar或者cookie字典传递cookie信息 fil ...

  9. python 装饰器(五):装饰器实例(二)类装饰器(类装饰器装饰函数)

    回到装饰器上的概念上来,装饰器要求接受一个callable对象,并返回一个callable对象(不太严谨,详见后文). 那么用类来实现也是也可以的.我们可以让类的构造函数__init__()接受一个函 ...

  10. Mysql and ORM

    本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql ORM sql ...