前面部分比较简单,就是无脑化式子,简单点讲好了。

首先肯定在\((x,y)=1\)时才考虑这个分数,要求纯循环的话,不妨猜猜结论,就是y必须和K互质。所以答案是\(\sum_{i=1}^n \sum_{j=1}^m [(i,j)=1] [(j,k)=1]\)。

然后用 \([(i,j)=1]=\sum_{d|i,j} \mu(d)\)大力化一化,很快就会得到:

\[\sum_{d=1}^{min(n,m)} \mu(d) \frac{n}{d} \sum_{d|j,j\le m}[(j,k)=1]
\]
\[=\sum_{d=1}^{min(n,m)} \mu(d) [(d,k)=1] \frac{n}{d} \sum_{j=1}^{\frac{m}{d}}[(j,k)=1]
\]

令后面那一坨\(\sum_{j=1}^{\frac{m}{d}}[(j,k)=1]=f(\frac{m}{d})\),它可以快速计算:

\[f(x)=\sum_{j=1}^x [(j,K)=1]
\]
\[=\sum_{j=1}^x \sum_{g|j,k} \mu(g)
\]
\[=\sum_{g|k}\mu(g) \sum_{g|j} 1
\]
\[=\sum_{g|k}\mu(g) \frac{x}{g}
\]

可以\(O(\sqrt k)\)计算。

回到原式

\[\sum_{d=1}^{min(n,m)} \mu(d) [(d,k)=1] \frac{n}{d} f(\frac{m}{d})
\]

这个显然可以分块吧,预处理一下\(\sum_{d=1}^{min(n,m)} \mu(d)[(d,k)=1]\)的前缀和就可以\(O(\sqrt n *\sqrt k)\)算答案了,因为是gcd的log,预处理做到2e7都不虚。

然后就有84分了。

考虑快速求\(F(k,x)=\sum_{d=1}^x \mu(d)*[(d,k)==1]\),同样拆后面的gcd。

\[F(k,x) =\sum_{d=1}^x \mu(d)*[(d,k)==1]
\]
\[=\sum_{d=1}^x \mu(d) \sum_{g|k,d} \mu(g)
\]
\[=\sum_{g|k} \mu(g) \sum_{g|d} \mu(d)
\]
\[=\sum_{g|k} \mu(g) \sum_{T=1}^{\frac{x}{g}} \mu(T*g)
\]

然后由于当\((T,g)\ne 1\)时\(\mu(T*g)\)显然=0。

\[=\sum_{g|k} \mu(g) \sum_{T=1}^{\frac{x}{g}} [(T,g)==1]*\mu(T)*\mu(g)
\]
\[=\sum_{g|k} \mu^2(g) \sum_{T=1}^{\frac{x}{g}} \mu(T)*[(T,g)==1]
\]
\[=\sum_{g|k} \mu^2(g) F(g,\frac{x}{g})
\]

然后递归算,顺便记忆化一下,另外当k=1时直接返回\(\sum_{i=1}^x \mu(i)\),因此要杜教筛预处理。

\(F(k,i)\)可以预处理一下\(k=K\)时x较小的若干项,会加快速度。

我根本不会算这个的复杂度,想到这后就直接去写了,极限数据一下就跑出来了就交了,别问我复杂度是多少,我不知道。复杂度应该和杜教筛差不多吧(如果对g讨论一下在x的\(\sqrt x\)段中的哪一段,这一段的k的约数统一计算的话)。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define pl puts("lala")
#define cp cerr<<"lala"<<endl
#define fi first
#define se second
#define pb push_back
#define ln putchar('\n')
using namespace std;
inline int read()
{
char ch=getchar();int g=1,re=0;
while(ch<'0'||ch>'9') {if(ch=='-')g=-1;ch=getchar();}
while(ch<='9'&&ch>='0') re=(re<<1)+(re<<3)+(ch^48),ch=getchar();
return re*g;
}
typedef long long ll;
typedef pair<int,int> pii; inline int gcd(int a,int b)
{
while(b) {int t=a%b; a=b; b=t;}
return a;
}
const int N=7e5+11;
int prime[N],cnt=0,mu[N],smu[N],resf[N],K;
bool isnotprime[N];
void init()
{
int n=N-11;
isnotprime[1]=1; mu[1]=1;
for(int i=2;i<=n;++i)
{
if(!isnotprime[i]) prime[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*prime[j]<=n;++j)
{
isnotprime[i*prime[j]]=1;
if(!(i%prime[j])) break;
mu[i*prime[j]]=-mu[i];
}
}
for(int i=1;i<=n;++i) smu[i]=smu[i-1]+mu[i];
for(int i=1;i<=n;++i) resf[i]=resf[i-1]+mu[i]*(gcd(i,K)==1);
} map<int,int>mp;
int M(int n)
{
if(n<=N-11) return smu[n];
if(mp.count(n)) return mp[n];
int &ans=mp[n]; ans=1;
for(int i=2,j;i<=n;i=j+1)
{
j=n/(n/i);
ans-=M(n/i)*(j-i+1);
}
return ans;
} map<int,int>F[2050];
int calcF(int k,int x)
{
if(k==1) return M(x);
if(k==K&&x<=N-11) return resf[x];
if(F[k].count(x)) return F[k][x];
int &ans=F[k][x];
for(int i=1;i*i<=k;++i) if(!(k%i))
{
if(mu[i]) ans+=mu[i]*mu[i]*calcF(i,x/i);
if(i*i!=k)
{
int oth=k/i;
if(mu[oth]) ans+=mu[oth]*mu[oth]*calcF(oth,x/oth);
}
}
return ans;
} int n,m;
int divi[2050],tot=0;
inline int f(int x)
{
int ans=0;
for(int i=1;i<=tot;++i) ans+=mu[divi[i]]*(x/divi[i]);
return ans;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);freopen("1.out","w",stdout);
#endif
n=read(); m=read(); K=read();
init();
int mn=min(n,m);
M(mn);
for(int i=1;i*i<=K;++i) if(!(K%i))
{
divi[++tot]=i;
if(i*i!=K) divi[++tot]=K/i;
} ll ans=0;
for(int i=1,j;i<=mn;i=j+1)
{
j=min(n/(n/i),m/(m/i));
ans+=1ll*(n/i)*f(m/i)*(calcF(K,j)-calcF(K,i-1));
}
cout<<ans<<endl;
return 0;
}

uoj221【NOI2016】循环之美的更多相关文章

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

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

  2. luogu 1587 [NOI2016]循环之美

    LINK:NOI2016循环之美 这道题是 给出n m k 求出\(1\leq i\leq n,1\leq j\leq m\) \(\frac{i}{j}\)在k进制下是一个纯循环的. 由于数值相同的 ...

  3. 并不对劲的bzoj4652:loj2085:uoj221:p1587:[NOI2016]循环之美

    题目大意 对于已知的十进制数\(n\)和\(m\),在\(k\)进制下,有多少个数值上互不相等的纯循环小数,可以用\(x/y\)表示,其中 \(1\leq x\leq n,1\leq y\leq m\ ...

  4. bzoj4652 [Noi2016]循环之美

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

  5. [NOI2016]循环之美

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

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

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

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

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

  8. luogu P1587 [NOI2016]循环之美

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

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

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

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

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

随机推荐

  1. 从-99打造Sentinel高可用集群限流中间件

    接上篇Sentinel集群限流探索,上次简单提到了集群限流的原理,然后用官方给的 demo 简单修改了一下,可以正常运行生效. 这一次需要更进一步,基于 Sentinel 实现内嵌式集群限流的高可用方 ...

  2. 关于 java 的动态绑定机制

    关于 java 的动态绑定机制 聊一聊动态绑定机制, 相信看完这篇文章,你会对动态绑定机制有所了解. 网上大多一言概括: 当调用对象的时候,该方法会和该对象的内存地址/运行类型绑定. 当调用对象的属性 ...

  3. 议题征集令 | Apache DolphinScheduler Meetup 2021 来啦,议题征集正式开启!

    点击上方 蓝字关注我们 社区的小伙伴们,经过精心筹备,我们很高兴地宣布,Apache DolphinScheduler Meetup 2021 将于 2021 年 11 月 27 日到来! 在 Mee ...

  4. 轻松月薪过万,NISP证书含金量有多重|NISP管理中心|网安伴|nisp

    nisp一级证书含金量 NISP一级证书是面向各个行业工作人员信息安全意识普及化和网络信息安全基础培训的国家级验证.持NISP一级证书可以从信息安全保密较高的单位得到加分.证书由中国信息安全测评中心授 ...

  5. CSP2021-S游记

    前言 年纪大了,脑子乱了,渐渐被低年级吊打了. 大家这么内卷下去,高年级的普遍后悔自己生早了,低年级永远占优势,不只是机会优势,还有能力优势. 快进到改变基因出生国家队算了-- Day0 非常不幸地被 ...

  6. ARC122D XOR Game(博弈论?字典树,贪心)

    题面 ARC122D XOR Game 黑板上有 2 N 2N 2N 个数,第 i i i 个数为 A i A_i Ai​. O I D \rm OID OID(OneInDark) 和 H I D ...

  7. C#运用事件步骤(usual)

    1.声明一个委托 委托跟Main函数在同一个NameSpace中.或者在class A中. delegate void delegateFuncA; 2.声明一个事件 在class A中 public ...

  8. 安装配置华为Fusion acces(Lite AD)并使Windows登录

    安装Fusion access虚拟机 根据自己情况自定义 点击编辑虚拟机设置 添加镜像 点击确定并开启此虚拟机 选择第二个 Install 添加Network:修改hostname:修改密码 回车添加 ...

  9. Helm安装ingress-nginx-4.2.3

    Application version 1.3.0 Chart version 4.2.3 获取chart包 helm fetch ingress-nginx/ingress-nginx --vers ...

  10. HBase集群部署与基础命令

    HBase 集群部署 安装 hbase 之前需要先搭建好 hadoop 集群和 zookeeper 集群.hadoop 集群搭建可以参考:https://www.cnblogs.com/javammc ...