数论十题

数论十题

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),i≤min(a,b)/x).然后倒推即可。

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

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

一步步推导:

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

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

再推一步?

记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。

这样我们发现,其实,感觉简化了很多。

不难发现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|i且d|j)。我们再整理一下就是:。我们记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

必须还不会。

时间: 2024-08-05 19:36:10

数论十题的相关文章

矩阵十题【三】 HDU 1588 Gauss Fibonacci

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1588 题目大意:先要知道一组斐波那契数列 i 0 1 2 3 4 5 6 7 f(i) 0 1 1 2 3 5 8 13 下面给你一组数: k,b,n,M 现在知道一组公式g(i)=k*i+b:(i=0,1,2,3...n-1) 让你求出 f(g(i)) 的总和(i=01,2,3,...,n-1),比如给出的数据是2 1 4 100 2*0+1=1   f(1)=1 2*1+1=3   f(3)=2

数论 --- 简单题

吃糖果 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 22376    Accepted Submission(s): 6396 Problem Description HOHO, 终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一 种,这样:

矩阵十题【一】

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=298 题目大意:已知n个点(n<10000),现在对所有点进行以下操作: 平移一定距离(M),相对X轴上下翻转(X),相对Y轴左右翻转(Y),坐标缩小或放大一定的倍数(S),所有点对坐标原点逆时针旋转一定角度(R). 操作的次数不超过1000000次,求最终所有点的坐标. 首先我们要知道矩阵乘法的概念. 在数学中,一个矩阵说穿了就是一个二维数组.一个n行m列的矩阵可以乘以一个m行p列的矩

BZOJ1968: [Ahoi2005]COMMON 约数研究(数论 水题)

Description Input 只有一行一个整数 N(0 < N < 1000000). Output 只有一行输出,为整数M,即f(1)到f(N)的累加和. Sample Input 3 Sample Output 5 Solve: 数论水题,求因数又不是质因数,所以,只要求出对于[1 , n]有多少个倍数,就表示[1 , n]中以i为因数的是哪些,加起来就可以了 Code: 1 #include <bits/stdc++.h> 2 using namespace std;

POJ 3358 Period of an Infinite Binary Expansion( 数论好题 + 欧拉定理 + 欧拉函数 )

POJ 3358 Period of an Infinite Binary Expansion( 数论好题 + 欧拉定理 + 欧拉函数 ) #include <cstdio> #include <cstring> #include <algorithm> #include <algorithm> using namespace std; typedef long long LL; LL fac[ 100000 ], pf; LL gcd( LL a, LL

矩阵十题【十】 poj 3613 Cow Relays

题目链接:http://poj.org/problem?id=3613 题目大意: 输入N,T,S,E,N表示要走的边数,T表示一共有几条边,S表示开始的点,E表示结束的点 给出一张无向连通图,求S到E经过N条边的最短路. N (2 ≤ N ≤ 1,000,000) T (2 ≤ T ≤ 100) (1 ≤ I1i ≤ 1,000; 1 ≤ I2i ≤ 1,000) 1 ≤ lengthi  ≤ 1,000 题目主要的思想就是用矩阵的乘法模拟出Floyd进行运算,是个很好的题目. //k步最短路

矩阵十题【六】 poj3070 Fibonacci

题目链接:http://poj.org/problem?id=3070 题目大意:给定n和10000,求第n个Fibonacci数mod 10000 的值,n不超过2^31.结果保留四位数字. 很简单的题,和之前做过的相比简单很多了. 构造最简单的斐波那契数列矩阵. #include<iostream> #include<cstring> #include<stdio.h> using namespace std; const int MAX = 2; struct M

矩阵十题【五】 VOJ1049 HDU 2371 Decode the Strings

题目链接:https://vijos.org/p/1049 题目大意:顺次给出m个置换,反复使用这m个置换对初始序列进行操作,问k次置换后的序列.m<=10, k<2^31. 首先将这m个置换"合并"起来(算出这m个置换的乘积),然后接下来我们需要执行这个置换k/m次(取整,若有余数则剩下几步模拟即可).注意任意一个置换都可以表示成矩阵的形式.例如,将1 2 3 4置换为3 1 2 4,相当于下面的矩阵乘法: 置换k/m次就相当于在前面乘以k/m个这样的矩阵.我们可以二分计

uva 10006 数论入门题

这是一个入门的数论题目 , 只需要简单的找素数和快速幂取模 题意:输入一个数 n , 如果这个数是非素数 , 问是不是 这个2~n-1区间的所有数都满足 ? 解法:由于数据量不大 , 可以直接暴力求解 解法1: 暴力求解 #include <iostream> #include <string.h> #include <stdio.h> using namespace std; long long prime[65010]; long long n; void init