数论十(一)题

Problem Zero:[neerc2011]Gcd guessing game

现在有一个数x,1 ≤ x≤ n,告诉你n,每次你可以猜一个数y,如果x==y则结束,否则返回gcd(x,y),问最少只要几次就可以保证猜出答案。

 

本题纯属娱乐。仅仅是一个GCD的游戏,跑题了。

因为本题要求最坏情况,我们直观地猜想就是每次返回都是1。由于答案有可能是质数,而判定一个数,必须要把含有这个质因子的数问一遍。于是,我们引出这样一个思路,将所有1-n的质数分组,每组的积<=n,答案就是组数。

这个问题可以贪心解决。每个大质数配上连续一段的小质数。

 

 

Problem One:[CQOI2007 余数之和sum]sigma(K%i),1 ≤ i ≤ n

 

K%i=K-(K/i)*i,对于i至K/(K/i)这一段K/i相同,可以一起算,可证总段数是sqrt(N)的。

复杂度:O(Sqrt(N))

 

 

Problem Two:[Longge's problem]sigma(gcd(i, n)) ,1 ≤ i ≤ n.

 

枚举d=gcd(i, n),由于小于n的数里gcd(i,n)=d的i一共有phi(n/d)个,所以Ans=Sigma(phi(N/d)),d|n.复杂度:O(k*sqrt(N))

 

 

Problem Three:[SPOJ LCMSUM]sigma(lcm(i, n)),1 ≤ i ≤ n. 多组询问

 

令S(i)= Sigma(i,i|n) =>iphi(i)/2

则Ans=nSigma(S(d),d|n)

直接做预处理phi(i),然后枚举约数,复杂度:O(N)-O(sqrt(N)).

令G(i)=iphi(i)/2,i|n,不难发现Ans=N((G(N)-1)/2+1).

由于可证G(N)是积性函数,所以我们可以在O(N)的时间内算出G(N),询问O(1).

 

 

Problem Four:[SPOJ GCDEX]sigma(gcd(i, j)), 1 ≤ i < j ≤ n 多组询问

 

可以枚举j变为Problem Two。无疑会TLE。

令T(N)=sigma(gcd(i,n)),1 ≤ i ≤ n,不难看出Ans=simga(T(i)) ,1 ≤ i ≤ n。

T(N)的函数与Problem Two相同,所以T(N)等价于sigma(N/d*phi(d)),d|N.

根据T(n)的定义,我们有T(1)=1,T(p^x)=p*T(p^(x-1))+phi(p^x).

由于可证T(N)是积性函数,所以我们可以在O(N)的时间内算出T(N),询问O(1).

 

 

 

Problem Five:[双亲数/POI Zap(多组)]求gcd(i, j) == d (i ≤ a, j ≤ b) 的对数

 

Ans=gcd(i,j)=1 (i ≤ a/d, j ≤ b/d) 

F(x)表示gcd(i,j)>=x的对数,则F(x)=a/x*b/x

根据容斥原理:Ans=sigma(F(i)*u(i)),1 ≤ i ≤ n.

可以看出莫比乌斯反演的本质就是容斥

对于单个询问,显然可以O(N)求解。

对于多组数据,类比Problem One,不难可以推广得出a/x*b/x对于连续一段值是相同的,可证总段数是sqrt(N)+sqrt(M)的。于是我们O(N)求出F(x)后预处理前缀和,询问O(sqrt(N))

 

 

Problem Six:[SPOJ PGCD/BZOJ2820YY的GCD(多组)]

求gcd(i, j)是质数, 1 ≤ i ≤ a, 1 ≤ j ≤ b 的对数

 

可以枚举质数后问题转换为Problem Five。对于单个询问,复杂度O(N)

对于多组数据,按枚举质数的思路,结合Problem Five

Ans=sigma[ sigma(u(d)*(N/(pd))*(N/(pd))) 1 ≤ d≤ n] p为质数

将p作为变量,令T=pd,Ans=sigma[(N/T)*(M/T)*sigma(u(T/p)) ,p为质数且p|T

将里面的求和提出:记G(x)=sigma(u(x/p),p为质数且p|x.

问题的关键在于求解G(x),如果我们能将G(x)一一求出,则只需套用Problem Five相对Problem One的推广形式,预处理G(x)前缀和,使得询问复杂度为O(sqrt(N))

我们通过u函数的定义和一些性质,可以得到如下这么一个非常有用的结论:

若p|x则g(px)=u(x),否则g(px)=u(x)-g(x)。这两种情况正好对应了线性筛法的两种情况(实质是是否有平方因子)。于是,我们可以用线性筛法O(N)预处理求出G。

本题的亮点在于虽然G(N)函数不满足积性,但我们可以通过线性筛法算出G(N)来。

至此,问题得到了完美解决。

 

 

Problem Seven:[NOI 2010 能量采集]sigma(gcd(i, j)), i ≤ a, j ≤ b

F(x)表示gcd(i,j)==x的对数,根据容斥原理:F(x)=(a/x)*(b/x)-sigma(F(i*x),imin(a,b)/x).然后倒推即可。

 

 

 

Problem Eight:[Crash的数字表格/BZOJ2693 jzptab(多组)]

sigma(lcm(i, j)) ,i ≤ a, j ≤ b

 

一步步推导:

wps_clip_image-31785[6]

推导的关键在最后两步,可以发现,我们将倒数第二步里的d提出与d结合后,可以把外面d消掉了(也正是本题的特殊之处),那么我们化简后只要一共枚举两个变量就行了。

推到这一步,我们发现求和式就是Problem One和Problem Five的结合,可以直接套用解决,单个询问复杂度为O(N)。但多组无疑会TLE。

 

再推一步?

wps_clip_image-4808[6]

记G(x)=x*sigma(d*u(d),d|x),因为可证G(x)是积性的,所以我们可以在O(N)的时间内算出G(x)。然后和Problem Six一样,只需套用Problem Five的推广形式,预处理G(x)前缀和,使得询问复杂度为O(sqrt(N))

至此,问题得到了完美解决。

 

 

Problem Nine:[BZOJ2694LCM]:

sigma(lcm(i, j)),i ≤ a, j ≤ b,gcd(i,j)为free-squares.(所有质因子的次数<=1)

 

从题目给出的条件入手,为了方便解决问题,我们可以设一个函数F(n)。

F(n)=1/n 当n为free-squares;否则为0。

这样我们发现,其实wps_clip_image-27747[6],感觉简化了很多。

不难发现F(n)是积性的,我们再令t(n)=sigma(u(i)*F(n/i),i|n)。这有什么用?我们可以用反演的方法把F(n)表示出来时答案更容易求解:F(n)=sigma(t(i),i|n)。那么我们可以发现F(gcd(i,j))实际上变成了这么一个东西:F(gcd(i,j))=sigma(t(d),d|id|j)。我们再整理一下就是:wps_clip_image-5203[6]。我们记G(x)=x*x*sigma(u(i)*F(x/i),i|x)。不难发现G(x)积性的,所以所以我们可以在O(N)的时间内算出G(x)。和Problem Eight一样预处理G(x)前缀和,使得询问复杂度为O(sqrt(N))

至此,问题得到了完美解决。

 

 

 

Problem Ten:[BZOJ2627 JZPKIL(顾昱洲)]

给定x,y,n,求Sigma(gcd(i,n)^x*lcm(i,n)^y),i ≤ n

 

必须还不会。

原文地址:https://www.cnblogs.com/oldmanren/p/2784986.html