【NOI2016】循环之美【莫比乌斯反演】【整除分块】【杜教筛】【类杜教筛】

传送门

题意:给定n,m,kn,m,kn,m,k,求1≤x≤n,1≤y≤m1\leq x\leq n,1\leq y\leq m1xn,1ymxyx \over yyx中数值不同的纯循环小数或整数的个数。

n≤109,m≤109,k≤2×103n \leq 10^9,m\leq10^9,k\leq2\times10^3n109,m109,k2×103

显然只需要考虑最简分数即gcd⁡(x,y)=1\gcd(x,y)=1gcd(x,y)=1的情况

容(bu)易(yong)证明,xyx\over yyx满足题意当且仅当gcd⁡(y,k)=1\gcd(y,k)=1gcd(y,k)=1

所以

Ans=∑i=1N∑j=1M[gcd⁡(i,j)=1][gcd⁡(j,k)=1]Ans=\sum_{i=1}^N\sum_{j=1}^M[\gcd(i,j)=1][\gcd(j,k)=1]Ans=i=1Nj=1M[gcd(i,j)=1][gcd(j,k)=1]

换下顺序

=∑j=1M[gcd⁡(j,k)=1]∑i=1N[gcd⁡(i,j)=1]=\sum_{j=1}^M[\gcd(j,k)=1]\sum_{i=1}^N[\gcd(i,j)=1]=j=1M[gcd(j,k)=1]i=1N[gcd(i,j)=1]

把后面反演掉,前面不管

=∑j=1M[gcd⁡(j,k)=1]∑i=1N∑d∣i,d∣jμ(d)=\sum_{j=1}^M[\gcd(j,k)=1]\sum_{i=1}^N\sum_{d\mid i,d\mid j}\mu(d)=j=1M[gcd(j,k)=1]i=1Ndi,djμ(d)

枚举ddd

=∑d=1N⌊Nd⌋μ(d)∑d∣jj≤M[gcd⁡(j,k)=1]=\sum_{d=1}^N\lfloor \frac{N}{d}\rfloor\mu(d)\sum_{d\mid j}^{j\leq M}[\gcd(j,k)=1]=d=1NdNμ(d)djjM[gcd(j,k)=1]

换成枚举jjjddd的多少倍

=∑d=1N⌊Nd⌋μ(d)∑j=1⌊Md⌋[gcd⁡(jd,k)=1]=\sum_{d=1}^N\lfloor \frac{N}{d}\rfloor\mu(d)\sum_{j=1}^{\lfloor\frac{M}d{}\rfloor}[\gcd(jd,k)=1]=d=1NdNμ(d)j=1dM[gcd(jd,k)=1]

gcd⁡\gcdgcd拆开

=∑d=1N⌊Nd⌋μ(d)∑j=1⌊Md⌋[gcd⁡(j,k)=1][gcd⁡(d,k)=1]=\sum_{d=1}^N\lfloor \frac{N}{d}\rfloor\mu(d)\sum_{j=1}^{\lfloor\frac{M}d{}\rfloor}[\gcd(j,k)=1][\gcd(d,k)=1]=d=1NdNμ(d)j=1dM[gcd(j,k)=1][gcd(d,k)=1]

=∑d=1N⌊Nd⌋μ(d)[gcd⁡(d,k)=1]∑j=1⌊Md⌋[gcd⁡(j,k)=1]=\sum_{d=1}^N\lfloor \frac{N}{d}\rfloor\mu(d)[\gcd(d,k)=1]\sum_{j=1}^{\lfloor\frac{M}d{}\rfloor}[\gcd(j,k)=1]=d=1NdNμ(d)[gcd(d,k)=1]j=1dM[gcd(j,k)=1]

f(n,k)=∑i=1n[gcd⁡(i,k)=1]f(n,k)=\sum_{i=1}^n[\gcd(i,k)=1]f(n,k)=i=1n[gcd(i,k)=1]

由于kkk只有200020002000,并且gcd⁡(i,k)=gcd⁡(i%k,k)\gcd(i,k)=\gcd(i\%k,k)gcd(i,k)=gcd(i%k,k),所以瞎预处理一下就可以算出来

这样

Ans=∑d=1N⌊Nd⌋μ(d)[gcd⁡(d,k)=1]f(⌊Md⌋,k)Ans=\sum_{d=1}^N\lfloor \frac{N}{d}\rfloor\mu(d)[\gcd(d,k)=1]f(\lfloor\frac{M}{d}\rfloor,k)Ans=d=1NdNμ(d)[gcd(d,k)=1]f(dM,k)

这是个整除分块的形式,我们只需要想办法算出

g(n,k)=∑i=1nμ(i)[gcd⁡(i,k)=1]g(n,k)=\sum_{i=1}^n\mu(i)[\gcd(i,k)=1]g(n,k)=i=1nμ(i)[gcd(i,k)=1]

这个可以反演

g(n,k)=∑i=1nμ(i)∑d∣i,d∣kμ(d)g(n,k)=\sum_{i=1}^n\mu(i)\sum_{d\mid i,d\mid k}\mu(d)g(n,k)=i=1nμ(i)di,dkμ(d)

枚举ddd

g(n,k)=∑d∣kμ(d)∑d∣ii≤nμ(i)g(n,k)=\sum_{d\mid k}\mu(d)\sum_{d\mid i}^{i\leq n}\mu(i)g(n,k)=dkμ(d)diinμ(i)

枚举倍数

g(n,k)=∑d∣kμ(d)∑i=1⌊nd⌋μ(id)g(n,k)=\sum_{d\mid k}\mu(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(id)g(n,k)=dkμ(d)i=1dnμ(id)

前方高能

观察μ(id)\mu(id)μ(id),发现如果gcd⁡(i,d)≠1\gcd(i,d)\neq1gcd(i,d)=1,μ(id)\mu(id)μ(id)一定等于000

所以……我们可以丢一个[gcd⁡(i,d)=1][\gcd(i,d)=1][gcd(i,d)=1]进去

g(n,k)=∑d∣kμ(d)∑i=1⌊nd⌋μ(id)[gcd⁡(i,d)=1]g(n,k)=\sum_{d\mid k}\mu(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(id)[\gcd(i,d)=1]g(n,k)=dkμ(d)i=1dnμ(id)[gcd(i,d)=1]

由于μ\muμ是积性函数,有这个限制就可以拆开了,然后把μ(d)\mu(d)μ(d)丢前面去

g(n,k)=∑d∣kμ2(d)∑i=1⌊nd⌋μ(i)[gcd⁡(i,d)=1]g(n,k)=\sum_{d\mid k}\mu^2(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\mu(i)[\gcd(i,d)=1]g(n,k)=dkμ2(d)i=1dnμ(i)[gcd(i,d)=1]

后面那个有没有很眼熟?

g(n,k)=∑d∣kμ2(d)g(⌊nd⌋,d)g(n,k)=\sum_{d\mid k}\mu^2(d)g(\lfloor\frac{n}{d}\rfloor,d)g(n,k)=dkμ2(d)g(dn,d)

然后就可以递归了

边界:

n=0n=0n=0时,g(n,k)=0g(n,k)=0g(n,k)=0

k=1k=1k=1时,我们发现无法递归

所以写个杜教筛算一下就可以了

复杂度O(能过)O(能过)O()

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <utility>
#include <map>
using namespace std;
typedef long long ll;
const int N=1e6;
int n,m,k;
int np[N+5],pl[N],cnt;
int mu[N+5],sum[N+5];
void init()
{np[1]=mu[1]=1;for (int i=2;i<=N;i++){if (!np[i]) pl[++cnt]=i,mu[i]=-1;for (int j=1,x;(x=i*pl[j])<=N;j++){np[x]=1;if (i%pl[j]==0){mu[x]=0;break;}else mu[x]=-mu[i];}}for (int i=1;i<=N;i++) sum[i]=sum[i-1]+mu[i];
}
map<int,int> ms;
int getms(int n)
{if (n<=N) return sum[n];map<int,int>::iterator p;if ((p=ms.find(n))!=ms.end()) return p->second;int ans=1;for (int l=2,r;l<=n;l=r+1){r=n/(n/l);ans-=(r-l+1)*getms(n/l);}ms.insert(make_pair(n,ans));return ans;
}
int x[2005];
int gcd(int a,int b){return b? gcd(b,a%b):a;}
inline int f(const int& n){return n/k*x[k]+x[n%k];}
map<pair<int,int>,int> sg;
int g(int n,int k)
{if (n==0) return 0;if (k==1) return getms(n);map<pair<int,int>,int>::iterator p;pair<int,int> pi=make_pair(n,k);if ((p=sg.find(pi))!=sg.end()) return p->second;int ans=0;for (int i=1;i*i<=k;i++)if (k%i==0){if (mu[i]) ans+=g(n/i,i);if (i*i<k&&mu[k/i]) ans+=g(n/(k/i),k/i);}sg.insert(make_pair(pi,ans));return ans;
}
int main()
{init();scanf("%d%d%d",&n,&m,&k);for (int i=1;i<=k;i++) x[i]=x[i-1]+(gcd(i,k)==1);ll ans=0;for (int l=1,r;l<=n&&l<=m;l=r+1){r=min(n/(n/l),m/(m/l));ans+=(ll)(n/l)*f(m/l)*(g(r,k)-g(l-1,k));}printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1020 [NOIP1999 普及组] 导弹拦截 Dilworth定理 + dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 对于第一问直接输出最长不严格下降子序列即可&#xff0c;第二问是Dilworth定理&#xff0c;变形比较多&#xff0c;之前也写过类似的&#xff0c;这里贴个证明。 //#pragma GCC optimiz…

参数传递机制之JWT

1. 什么是 JWTJWT 其全称为&#xff1a;JSON Web Token&#xff0c;简单地说就是 JSON 在 Web 上的一种带签名的标记形式。官方的定义如下&#xff1a;JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.…

【NOI2009】诗人小G【决策单调性dp】

传送门 设句子加上空格长度前缀和为sss 转移方程为 fimin⁡1≤j<i{fj∣si−sj−L−1∣P}f_i\min_{1\leq j<i}\{f_j|s_i-s_j-L-1|^P\}fi​1≤j<imin​{fj​∣si​−sj​−L−1∣P} 不难发&#xff08;cai&#xff09;现&#xff08;chu&#xff09;决策具有单调性 …

Codeforces Round #709 (Div. 1) B. Playlist 链表维护 + bfs

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 紧跟刘爷脚步补题。 不难想到用链表维护下一个数是什么&#xff0c;这样就跟以前做过的一个题差不多了&#xff0c;首先将初始的时候删掉的点的前一个点即为题目中的AAA入队&#xff0c;让…

浅谈ASP.NET Core中IOC与DI的理解和使用

说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生&#xff0c;早前&#xff0c;自己也有尝试过去了解这两个东西&#xff0c;但是一直觉得有点很难去理解&#xff0c;总觉得对其还是模糊不清&#xff0c;所以&#xff0c;趁着今天有空&#xff0c;就去把两个概念捋清…

Codeforces Round #715 (Div. 1) C. Complete the MST 补图 + 思维 + 最小生成树

传送门 文章目录题意&#xff1a;思路题意&#xff1a; 给你一张nnn个点mmm个边的图&#xff0c;mmm条边是给定的&#xff0c;要求你给未给定的边赋值一个边权&#xff0c;使得所有边权异或和为000&#xff0c;求所有满足这种情况的图中最小生成树边权和最小的&#xff0c;输出…

一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE

这是一个.net下操作数据库(结构数据库)的工具类&#xff0c;支持sqlserver、oracle、mysql、postgres、sqlite、access等常见数据库。注意&#xff1a;它并不是一个orm工具(常见的orm框架如&#xff1a;EF、Dapper等)。2.1 引入DBUtil依赖1. 首先打开vs(推荐vs2019)&#xff0c…

【NOI2012】迷失游乐园【概率期望】【换根dp】【基环树】

传送门 题意&#xff1a;给一棵nnn个点的带边权树或基环树&#xff0c;随机选一个点作为起点&#xff0c;每次随机走到一个相邻未走过的位置&#xff0c;直到无路可走。求期望路径长度。 n≤105n \leq 10^5n≤105,为基环树时环的大小不超过202020 先考虑树怎么做废话 先只考…

Educational Codeforces Round 37 (Rated for Div. 2) E. Connected Components? 暴力 + 补图的遍历

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤2e5,m≤2e5n\le2e5,m\le2e5n≤2e5,m≤2e5。 思路&#xff1a; 这是题是我上个题的一部分&#xff0c;算是个小知识点&#xff0c;暴力能过。 直接维护一个setsetset&#xff0c;让后遍历所有点&#xff…

初探System.Threading.Channels

。System.Threading.Channels是.Net Core基础类库中实现的一个多线程相关的库&#xff0c;专门处理数据流相关的操作&#xff0c;用来在生产者和订阅者之间传递数据&#xff08;不知道可不可以理解为线程间传递数据&#xff0c;我把它类比成了Go语言中的Channel&#xff09;&am…

【LOJ6033】棋盘游戏【二分图博弈】

传送门 显然是个二分图&#xff0c;设开始位置是左边&#xff0c;另一边是右边 那么先手是把左边挪到右边&#xff0c;后手是把右边挪到左边&#xff0c;不能挪的那方失败 结论&#xff1a;Alice必胜当且仅当开始位置不一定在最大匹配上 必要性&#xff1a; 如果开始位置不…

Codeforces Round #715 (Div. 1) B. Almost Sorted 找规律

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 找规律yydsyydsyyds。 一看没什么想法&#xff0c;所以打了个表&#xff0c;好家伙&#xff0c;不打不知道&#xff0c;一打不得了&#xff0c;下面是n6n6n6的符合要求的情况&#xff1a; …

SQL Server之索引解析(二)

、堆表堆表通过IAM连接一起&#xff0c;查询时全表扫描。1、1 非聚集索引结构叶子节点数据结构&#xff1a;行数据结构Rid&#xff08;8字节&#xff09;中间节点数据结构&#xff1a; &#xff08;非聚集非唯一索引&#xff09;行数据结构Page&#xff08;4&#xff09;2 Rid&…

【NOI2011】兔兔与蛋蛋的游戏【二分图博弈】

传送门 结论 不会有同一个棋子移动两次 反证法&#xff0c;对于第一个移动第二次的棋子 设两次移动之间(含)的移动的棋子为A1,A2,A3,……&#xff0c;AnA_1,A_2,A_3,……&#xff0c;A_nA1​,A2​,A3​,……&#xff0c;An​&#xff08;指棋子本身而非位置&#xff09; 因…

CF1528C dfs序+set维护

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两棵有nnn个节点的树&#xff0c;我门记第一棵为aaa&#xff0c;第二棵为bbb&#xff0c;现在你有一个nnn个点都孤立的点集&#xff0c;两个点u,vu,vu,v可以连边当且仅当这两个点在aaa树中一个是另一个的…

纠正一个错误,分布式系统关注点第17篇

这里是Z哥的个人公众号每周五早8点 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「78」篇原创敬上今天来加个餐&#xff0c;紧急纠正一个错误。先和大家说一声抱歉&#xff1a;D昨晚睡觉前&#xff0c;惯例打开「订阅号助手」回复一些留言。有一位小伙伴提了…

【NOI2016】国王饮水记【贪心】【斜率优化】【决策单调性】

传送门 首先比h1h_1h1​小的肯定没用&#xff0c;直接无视 然后考虑合并的顺序 ①在无限制的情况下&#xff0c;合并多个不如一个一个合并 a<b<ca<b<ca<b<c时&#xff0c;ab2c2>abc3{{ab \over 2}c\over 2}>{{abc}\over 3}22ab​c​>3abc​ ②先…

CF946D Timetable 背包dp + 思维转换

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n,m,k≤500n,m,k\le500n,m,k≤500 思路&#xff1a; 将其转换成背包的模型&#xff0c;就可以想出来一个很明显的dpdpdp状态&#xff1a;f[i][j]f[i][j]f[i][j]表示前iii行花费了jjj的最小代价&#xff0c;…

.NET开发框架(三)-高可用服务器端设计

我们对框架功能作了简述&#xff0c;演示视频请点击 这里查看 &#xff0c;本章节&#xff0c;我们专门讲解一下&#xff0c;如何在Window服务器下&#xff0c;设计高可用的框架。我们的框架设计采用的是Window版本的服务端设计&#xff1a;整体框架图如下&#xff0c;为什么我…

P1537 弹珠 背包可行性dp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 疯狂水文章。 这个很明显是个背包&#xff0c;我们开一个布尔数组&#xff0c;之后枚举每组的个数&#xff0c;让后枚举1−61-61−6&#xff0c;再枚举容量kkk&#xff0c;注意顺序不能错了…