bzoj 4652: [Noi2016]循环之美
额,,网上一堆题解,,随便一找就找到笨蒟蒻扒的了。
这个比较神奇的是纯循环小数就是[(y,k)=1],题解有证明这个的,貌似就是k进制下的类似循环节,不会不会。。
然后这道题就变成了求这个东西:∑(x<=n)∑(y<=m) [(x,y)=1][(y,k)=1]
显然要反演一下, 出来这个东西∑(d<=n)[(d,k)==1] μ(d) (n/d) ∑ (j<=m/d) [(j,k)==1]
然后k固定,所以搞一个∑(d<=n)[(d,k)==1] μ(d)和 ∑ (j<=m/d) [(j,k)==1],这两部分有神奇的递推式,然后各种各种,,不会不会。。。
(公式怎么打啊。。。)
这位神犇写的很详细 %%%% http://www.cnblogs.com/lcf-2000/p/6250330.html
#include<bits/stdc++.h>
#define LL long long
using namespace std; const int maxn=;
const int mod=;
const int maxk=; int n,m,k,prime_k[maxk],cnt;
int prime[maxn],f[maxk];
int head[mod],next[maxn],to[maxn],tt;
int h1[][mod],n1[maxn],t1[maxn],t2;
bool vis[maxn],huzhi[maxk];
LL ans,zto[maxn],zt1[maxn],mo[maxn]; void mobius()
{
mo[]=;
for (int i=; i<maxn; i++)
{
if (!vis[i]) prime[++prime[]]=i,mo[i]=-;
for (int j=; j<=prime[] && i*prime[j]<maxn; j++)
{
vis[i*prime[j]]=;
if (i%prime[j]==)
{
mo[i*prime[j]]=;
break;
}
mo[i*prime[j]]=-mo[i];
}
}
for (int i=; i<maxn; i++) mo[i]+=mo[i-];
for (int i=; i<=k; i++) f[i]=f[i-]+(__gcd(i,k)==);
} LL F(int x){return (x/k)*f[k]+f[x%k];} LL solve_mo(int x)
{
if (x<maxn) return mo[x];
for (int i=head[x%mod];i;i=next[i]) if (to[i]==x) return zto[i];
int now=++tt; to[tt]=x; next[tt]=head[x%mod]; head[x%mod]=tt; zto[now]=;
for (int i=,nt=; nt<x; i=nt+) nt=x/(x/i),zto[now]-=(nt-i+)*solve_mo(x/i);
return zto[now];
}
LL G(int x, int y)
{
if (!x) return solve_mo(y);
if (y<=) return y;
for (int i=h1[x][y%mod];i;i=n1[i]) if (t1[i]==y) return zt1[i];
int now=++t2; t1[t2]=y; n1[t2]=h1[x][y%mod]; h1[x][y%mod]=t2;
return zt1[now]=G(x-,y)+G(x,y/prime_k[x]);
}
int main()
{
scanf("%d%d%d",&n,&m,&k); mobius();
for (int i=; prime[i]<=k; i++) if (k%prime[i]==) prime_k[++cnt]=prime[i];
for (int d=,l=min(n,m),pos; d<=l; d=pos+)
{
pos=min(n/(n/d),m/(m/d));// cout<<"!";
ans+=(G(cnt,pos)-G(cnt,d-))*(LL)(n/d)*F(m/d);
}
printf("%lld\n",ans);
return ;
}
小技巧:这里的记忆化搜索用链表代替了map(会不会map也是差不多的实现原理啊2333)
bzoj 4652: [Noi2016]循环之美的更多相关文章
- [UOJ#221][BZOJ4652][Noi2016]循环之美
[UOJ#221][BZOJ4652][Noi2016]循环之美 试题描述 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k 进制下,一个数的小数部 ...
- luogu 1587 [NOI2016]循环之美
LINK:NOI2016循环之美 这道题是 给出n m k 求出\(1\leq i\leq n,1\leq j\leq m\) \(\frac{i}{j}\)在k进制下是一个纯循环的. 由于数值相同的 ...
- bzoj4652 [Noi2016]循环之美
Description 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在k进制下,一个数的小数部分是纯循环的,那么它就是美的.现在,牛牛想知道:对于已知 ...
- [NOI2016]循环之美
Description 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k 进制下,一个数的小数部分是纯循环的,那么它就是美的.现在,牛牛想知道:对 ...
- BZOJ4652 [Noi2016]循环之美 【数论 + 莫比乌斯反演 + 杜教筛】
题目链接 BZOJ 题解 orz 此题太优美了 我们令\(\frac{x}{y}\)为最简分数,则\(x \perp y\)即,\(gcd(x,y) = 1\) 先不管\(k\)进制,我们知道\(10 ...
- BZOJ4652: [Noi2016]循环之美(莫比乌斯反演,杜教筛)
Description 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k 进制下,一个数的小数部分是纯循环的,那么它就是美的.现在,牛牛想知道:对 ...
- luogu P1587 [NOI2016]循环之美
传送门 首先要知道什么样的数才是"纯循环数".打表可以发现,这样的数当且仅当分母和\(k\)互质,这是因为,首先考虑除法过程,每次先给当前余数\(*k\),然后对分母做带余除法,那 ...
- 题解 P1587 【[NOI2016]循环之美】
知识点:莫比乌斯反演 积性函数 杜教筛 废话前言: 我是古明地恋,写这篇题解的人已经被我 请各位读者自行无视搞事的恋恋带有删除线的内容,谢谢茄子. 这道题目本身并不难,但是公式推导/代码过程中具有迷惑 ...
- BZOJ4652 NOI2016循环之美(莫比乌斯反演+杜教筛)
因为要求数值不同,不妨设gcd(x,y)=1.由提示可以知道,x/y是纯循环小数的充要条件是x·klen=x(mod y).因为x和y互质,两边同除x,得klen=1(mod y).那么当且仅当k和y ...
随机推荐
- Linux - kali Linux重置密码
1. recovery mode -> E 2. ro -> rw 3. plus init=/bin/bash 4. passwd root
- 操作系统OS,Python - 协程(Coroutine)
留坑 参考: https://en.wikipedia.org/wiki/Coroutine https://zh.wikipedia.org/wiki/%E5%8D%8F%E7%A8%8B http ...
- SVM总结(参考源码ml.hpp)
如何使用,请查阅我的另一篇博客——SVM的使用 1.setType() SVM的类型,默认SVM::C_SVC.具体有C_SVC=100,NU_SVC=101,ONE_CLASS=102,EPS_SV ...
- 常用FTP命令汇总
FTP是File Transport Protocol的简称,其作用是使连接到服务器上的客户可以在服务器和客户机间传输文件.除WWW服务外,FTP也算是使用最广泛的一种服务了.在cmd中ftp命令很多 ...
- P1025数的划分
P1025数的划分 #include <iostream> using namespace std; int n,k; int cnt; void dfs(int s,int step,i ...
- 谁才是天朝最厉害的演员?让Python来为你揭晓!
一.项目背景 上个月笔者的一个同学开了间影视投资公司,出于对创业人员的仰慕和影视投资行业的好奇,我就跟他寒暄了几句,聊天当中他提及到国庆节有部<攀登者>即将上映,预计票房会大好,因为吴京是 ...
- golang自定义error
系统自身的error处理一般是 errors.New()或fmt.Errorf()等,对一些需要复杂显示的,不太友好,我们可以扩展下error. error在标准库中被定义为一个接口类型,该接口只有一 ...
- 2020 NUC 19级第一次训练赛
感染(low) Description n户人家住在一条直线上,从左往右依次编号为1,2,...,n.起初,有m户人家感染了COVID-19,而接下来的每天感染的人家都会感染他家左右两家的人,问t天后 ...
- java Vector的特点与使用
Vector Vector的数据结构 基于数组,大小可变(数组扩容). Vector与ArrayList的比较 我看了下源码,最大区别就是Vector的方法加了synchronized,是线程安全的 ...
- CXL联盟正式成立:成员均是行业巨头
导读 今天,阿里巴巴.思科.戴尔EMC.Facebook.Google.HPE.华为.Intel.微软(按英文首字母排序)联合宣布,CXL联盟(Compute Express Link Consort ...