(2020年编辑)ACM必做50题的解题-数论

合集下载

ACM必做50题的解题-二分图

ACM必做50题的解题-二分图

poj 1325 Machine Schedule(最小点覆盖->二分图最大匹配)题意:有两台机器A和B,分别有n种和m种不同的模式,有k个工作,每个工作都可以在那两个机器的某种特定的模式下处理。

如job0既可以在A机器的3好模式下处理,也可以在B 机器的4号模式下处理。

机器的工作模式改变只能通过人工来重启。

通过改变工作的顺序,和分配每个工作给合适的机器可以减少重启机器的次数达到最小。

任务就是计算那个最小的次数。

初始时两台机器都运行在0号模式下。

思路:把每个任务化为一条线,假设任务i在A机器上处理的模式为A[x]点,在B机器上为B[y]点,连接A[x]和B[y],用A机器和B机器中最少的点覆盖所有的边(用最少的模式完成所有的任务)。

这是最小点覆盖问题,根据König定理(一个二分图中的最大匹配数等于这个图中的最小点覆盖数)就是求的二分图的最大匹配,然后再用匈牙利算法直接就算出最大匹配数了,要注意的是初始是在0号模式下,所以如果A或B机器其中至少有个在0号模式下时就不用重启机器了,所以建图的时候没有把0建进去。

关于二分匹配在/u3/102624/showart.php?id=2060232#include <stdio.h>#include <string.h>#define N 105#define M 1005int g[N][N];int used[N], mat[N], flag[N];int min, n, m;/*寻找增广路径*/int find(int k){int i, j;for(i=1; i<=g[k][0]; i++){j = g[k][i];if(!used[j]){used[j] = 1;if(mat[j]==-1 || find(mat[j])){mat[j] = k;return 1;}}}return 0;}/*匈牙利算法*/void hungary(){int i;for(i=1; i<=n-1; i++){min += find(i);memset(used, 0, sizeof(used));}printf("%d\n", min);}int main(){int i, j;int k, a, b, c;while(scanf("%d", &n) && n){scanf("%d%d", &m, &k);memset(mat, -1, sizeof(mat));memset(g, 0, sizeof(g)); //一开始这个没有初始化,wa了好多次,搞好久==!for(i=0; i<k; i++){scanf("%d%d%d", &a, &b, &c);if(b != 0 && c != 0){g[b][++g[b][0]] = c; //邻接表}}min = 0;hungary();}}poj 1469 COURSES二分匹配问题:匈牙利算法实现(可以作为模板)//二分匹配中,两个集合不能存在交集#include <iostream>#include <string.h>#include <stdio.h>using namespace std;#define array1 101#define array2 301bool map[array1][array2]; //定义临界矩阵int final[array2];int match[array2];int p,n; //两个集合分别存储p个元素和n个元素int DFS(int p) //p为课程{int i;int t;//遍历所有的学生for(i=1;i<n+1;++i){if(map[p][i] && !final[i]){final[i] = 1;t= match[i];match[i]= p; //路径取反操作(原来在匹配中的边变成不在匹配中,不在的变成在每一次)if(t==0 || DFS(t)) return 1; //找到了一条增广路径match[i] = t;}}return 0; //没有找到增广路径}int mat(){int matchmax = 0; //matchmax为最大匹配数//遍历所有的课程for(i=1;i<p+1;++i){memset(final,0,sizeof(final)); //重新标记未访问,此处要注意if(DFS(i)) matchmax++;}return matchmax;}int main(){//freopen("1.txt","r",stdin);int t;int i,j,k;int temptcount;int stu;scanf("%d",&t);for(i=0;i<t;++i){memset(map,0,sizeof(map)); //对临界矩阵进行初始化memset(match,0,sizeof(match));scanf("%d%d",&p,&n);for(j=1;j<p+1;++j){scanf("%d",&temptcount);for(k=0;k<temptcount;++k){scanf("%d",&stu);map[j][stu] = 1;}}if(mat()==p) printf("YES\n");else printf("NO\n");}return 0;}POJ 2195 Going Home二分图最佳匹配,经典的KM算法#include <stdio.h>#include <string.h>const int MAXN = 200+5;const int INF = 1000000000;int N;int g[MAXN][MAXN];int pre[MAXN];int lx[MAXN], ly[MAXN], slack[MAXN],man[MAXN][2],ff[MAXN][2]; bool visx[MAXN], visy[MAXN];int abs(int a){if(a<0)return -a;return a;}bool dfs(int t){int i;visx[t] = true;for(i = 0; i < N; i++){if(visy[i]) continue;int tmp = lx[t]+ly[i]-g[t][i];if(tmp == 0){visy[i] = true;if(pre[i] == -1 || dfs(pre[i])){pre[i] = t;return true;}}else if(slack[i] > tmp){slack[i] = tmp;}}return false;}int KM(){int i, j, k;for(i = 0; i < N; i++)lx[i] = -INF;memset(ly, 0, sizeof(ly));memset(pre, -1, sizeof(pre));for(i = 0; i < N; i++)for(j = 0; j < N; j++)if(lx[i] < g[i][j])lx[i] = g[i][j];for(i = 0; i < N; i++){for(j = 0; j < N; j++) slack[j] = INF;while(1){memset(visx, false, sizeof(visx));memset(visy, false, sizeof(visy));if(dfs(i)) break;int d = INF;for(j = 0; j < N; j++)if(!visy[j] &&d > slack[j])d = slack[j];for(j = 0; j < N; j++){if(visx[j]) lx[j] -= d;if(visy[j]) ly[j] += d;else slack[j] -= d;}}}int ans = 0;for(i = 0; i < N; i++){if(pre[i] != -1)ans -= g[pre[i]][i];}return ans;}int main(){int h,v,mf,mm;// freopen("1.txt","r",stdin);scanf("%d%d",&h,&v);while(h!=0||v!=0){mm=mf=0;for(int i=0;i<h;i++)for(int j=0;j<v;j++){char c;scanf("%c",&c);while(c!='.'&&c!='H'&&c!='m')scanf("%c",&c);if(c=='H'){ff[mf][0]=i;ff[mf][1]=j;mf++;}if(c=='m'){man[mm][0]=i;man[mm][1]=j;mm++;}}N=mm;for(int i=0;i<N;i++)for(int j=0;j<N;j++)g[i][j]=-(abs(man[i][0]-ff[j][0])+abs(man[i][1]-ff[j][1]));printf("%d\n",KM());scanf("%d%d",&h,&v);}}POJ 2446 Chessboard算法:很囧的题,本来打算用搜索过的,发现深搜肯定超时,试了一下,果然超时。

c acm试题及答案

c acm试题及答案

c acm试题及答案ACM(Association for Computing Machinery)是计算机科学领域的国际性学术组织,旨在推动计算机科学的发展与研究。

ACM竞赛是ACM组织举办的一项计算机算法编程竞赛,每年都有数以千计的计算机专业学生参加。

这篇文章将介绍一道ACM试题,并提供解答。

题目描述:给定一个整数数组nums,其中所有元素都是非负整数,现在要求你计算nums中连续子数组的最大和,并输出该最大和。

输入:第一行输入一个整数n,表示数组长度(1 <= n <= 10^5)。

第二行输入n个整数,表示数组nums的元素(元素范围为0 <= nums[i] <= 100)。

输出:输出一个整数,表示nums中连续子数组的最大和。

示例:输入:51 2 3 4 5输出:15解释:最大和子数组为[1, 2, 3, 4, 5],和为15。

解答:首先,我们可以使用一个变量maxSum来记录当前得到的最大和,初始化为0。

同时,我们还使用一个变量sum来记录当前连续子数组的和,初始化为0。

接下来,我们对数组nums进行遍历。

对于每一个元素nums[i],我们将其加到sum中,并判断sum是否大于0。

如果sum大于0,说明当前连续子数组的和对后面的结果是有正向贡献的,我们可以继续累加后面的元素。

如果sum小于等于0,说明当前连续子数组的和对后面的结果没有正向贡献,我们可以将sum重新置为0,重新开始计算连续子数组的和。

在遍历过程中,我们不断更新maxSum的值,保证其为当前得到的最大和。

最终,遍历结束后的maxSum即为所求的最大和。

下面是具体的实现代码:```cpp#include <iostream>#include <vector>#include <algorithm>using namespace std;int maxSubArray(vector<int>& nums) { int maxSum = 0;int sum = 0;for(int i = 0; i < nums.size(); i++) { sum += nums[i];if(sum > maxSum) {maxSum = sum;}if(sum <= 0) {sum = 0;}}return maxSum;}int main() {int n;cin >> n;vector<int> nums(n);for(int i = 0; i < n; i++) {cin >> nums[i];}int result = maxSubArray(nums);cout << result << endl;return 0;}```以上就是解答c acm试题并提供相应代码的文章。

acm大赛试题及答案

acm大赛试题及答案

acm大赛试题及答案ACM大赛试题及答案1. 题目一:字符串反转问题描述:编写一个程序,输入一个字符串,输出其反转后的字符串。

输入格式:输入包含一个字符串,字符串长度不超过100。

输出格式:输出反转后的字符串。

示例:输入:hello输出:olleh答案:```pythondef reverse_string(s):return s[::-1]input_string = input().strip()print(reverse_string(input_string))```2. 题目二:计算阶乘问题描述:编写一个程序,输入一个非负整数n,输出n的阶乘。

输入格式:输入包含一个非负整数n,n不超过20。

输出格式:输出n的阶乘。

示例:输入:5输出:120答案:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n - 1)n = int(input())print(factorial(n))```3. 题目三:寻找最大数问题描述:给定一个包含n个整数的数组,找出数组中的最大数。

输入格式:输入包含一个整数n,表示数组的大小,随后是n个整数。

输出格式:输出数组中的最大数。

示例:输入:5 1 2 3 4 5输出:5答案:```pythonn = int(input())numbers = list(map(int, input().split()))max_number = max(numbers)print(max_number)```4. 题目四:判断闰年问题描述:编写一个程序,输入一个年份,判断该年份是否为闰年。

输入格式:输入包含一个整数,表示年份。

输出格式:如果输入的年份是闰年,则输出"Yes",否则输出"No"。

示例:输入:2000输出:Yes答案:```pythonyear = int(input())if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):print("Yes")else:print("No")```5. 题目五:斐波那契数列问题描述:编写一个程序,输入一个非负整数n,输出斐波那契数列的第n项。

acm编程练习题

acm编程练习题

acm编程练习题ACM(即:美国计算机协会)编程练习题是指ACM国际大学生程序设计竞赛中的一些编程题目,旨在考察参赛选手在算法和数据结构等方面的能力。

这些题目常常要求选手设计和实现一个算法,在规定的时间和空间限制下解决实际问题。

ACM编程练习题具有一定的难度和挑战性,它的解题过程有时需要选手在理论基础上进行创新思维和灵活运用。

相比于传统的笔试或面试形式,ACM编程练习题更加贴近实际应用场景,能够真实地展现参赛选手的编程能力和逻辑思维能力。

为了更好地完成ACM编程练习题,选手需要熟练掌握常用的数据结构和算法,比如数组、链表、栈、队列、树、图等。

此外,对于一些经典的算法,如贪心算法、动态规划、分治法等,也有必要进行深入学习和理解。

在真实的竞赛环境中,选手还需要熟悉特定的编程语言和开发环境,比如C++、Java或Python等。

解决ACM编程练习题有着多种方法和思路。

选手需要熟悉各种问题的特点,根据问题所给条件进行合理的算法设计。

对于一些复杂的问题,可以利用数学方法进行简化和转化,从而找到更高效的解决方案。

在编程实现的过程中,要注重代码的可读性和可维护性,合理地使用注释和命名,避免代码冗余和错误。

ACM编程练习题的解题过程中,选手不仅需要具备扎实的编程基础和算法知识,还需要具备压力下的良好心态和团队合作精神。

在竞赛中,选手可能面临时间紧迫、出题者的陷阱、复杂场景等挑战,因此,选手们需要保持冷静、灵活应对,不断提升自己的解题能力和竞赛技巧。

总之,ACM编程练习题是一种非常有挑战性的编程竞赛形式,对选手的编程能力、算法思维和团队协作能力都提出了较高的要求。

通过积极参与练习和实战,选手们可以不断提升自己,在ACM竞赛中取得更好的成绩,并在实际工作中具备更强的编程能力。

(字数:413)。

ACM数论方面十道基础题目详解

ACM数论方面十道基础题目详解
while(scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l)!=EOF)
{
a=n-m;
b=l;
c=x-y;
r=gcd(a,b);
if(c%r)
{
printf("Impossible\n");
continue;
}
a/=r;
b/=r;
c/=r;
exgcd(a,b,k1,k2);
直接给出>
main()
{
int a,b,c,n;
scanf("%d%d%d",&a,&b,&c);
for(n=11;n<100;n++)
if(n%3==a&&n%5==b&&n%7==c)
printf("%d\n",n);
}
中国剩余定理思路代码:
inline int Gcd(int m,int n) //求最大公约数
{
if (m==0) return n;
return Gcd(n%m,m);
}
int main()
{
int n,a,b,g;
cin>>n;
while(n--)
{
cin>>a>>b;
g=Gcd(a,b);
cout<<g<<" "<<a*b/g<<endl;
if(n<=0)
n+=21252;
printf("%d\n",n);

ACM竞赛试题集锦(2020年九月整理).doc

ACM竞赛试题集锦(2020年九月整理).doc

ACM竞赛试题集锦(2020年九⽉整理).doc取⽯⼦游戏Time Limit:1S Memory Limit:1000KTotal Submit:505 Accepted:90Description有两堆⽯⼦,数量任意,可以不同。

游戏开始由两个⼈轮流取⽯⼦。

游戏规定,每次有两种不同的取法,⼀是可以在任意的⼀堆中取⾛任意多的⽯⼦;⼆是可以在两堆中同时取⾛相同数量的⽯⼦。

最后把⽯⼦全部取完者为胜者。

现在给出初始的两堆⽯⼦的数⽬,如果轮到你先取,假设双⽅都采取最好的策略,问最后你是胜者还是败者。

Input输⼊包含若⼲⾏,表⽰若⼲种⽯⼦的初始情况,其中每⼀⾏包含两个⾮负整数a 和b,表⽰两堆⽯⼦的数⽬,a和b都不⼤于1,000,000,000。

Output输出对应也有若⼲⾏,每⾏包含⼀个数字1或0,如果最后你是胜者,则为1,反之,则为0。

Sample Input2 18 44 7Sample Output1跳蚤Time Limit:1S Memory Limit:1000KTotal Submit:198 Accepted:44DescriptionZ城市居住着很多只跳蚤。

在Z城市周六⽣活频道有⼀个娱乐节⽬。

⼀只跳蚤将被请上⼀个⾼空钢丝的正中央。

钢丝很长,可以看作是⽆限长。

节⽬主持⼈会给该跳蚤发⼀张卡⽚。

卡⽚上写有N+1个⾃然数。

其中最后⼀个是M,⽽前N个数都不超过M,卡⽚上允许有相同的数字。

跳蚤每次可以从卡⽚上任意选择⼀个⾃然数S,然后向左,或向右跳S个单位长度。

⽽他最终的任务是跳到距离他左边⼀个单位长度的地⽅,并捡起位于那⾥的礼物。

⽐如当N=2,M=18时,持有卡⽚(10, 15, 18)的跳蚤,就可以完成任务:他可以先向左跳10个单位长度,然后再连向左跳3次,每次15个单位长度,最后再向右连跳3次,每次18个单位长度。

⽽持有卡⽚(12, 15, 18)的跳蚤,则怎么也不可能跳到距他左边⼀个单位长度的地⽅。

ACM-数论

ACM-数论
a ( b mod [m1 , m2 这里[m1 , m2 , ms ]). , ms 最小公倍数 , ms ]表示m1 , m2
a b m (mod ) d d d


公约数、公倍数及互素

定义: 公约数,亦称“公因数”。如果一个整数同时是几个整数的 约数,称这个整数为它们的“公约数”;公约数中最大的 称为最大公约数(Greatest Common Divisor 缩写G.C.D )。

性质4 设p为素数且p|ab,则p|a或p|b 定理2(唯一分解定理)任一自然数n皆可唯一表为素数之 积
ak a1 a2 n p1 p2 ... pk
p1 p2 ... pk 为素数,a1 , a2 ,
, ak 为自然数
几个数论函数

函数[x]


设x是实数,不大于x的最大整数称为x的整数部分,记为[x];x-[x] 称为x的小数部分,记为{x}。 性质:若p a || n !,则a [ n ] [ n2 ] [ n3 ] ...
又35 243 250-7 -7(mod 50),于是
26 5 2 (25733 +46) (35) 3 (-7)5 3 (72) 7 3 21 29(mod 50)
注意到0 29 50,所以29就是所求余数
事实上,a k 1(mod m)时, 对于大的指数n,利用带余除法定理,可得n=kq+r, 0 r k,于是有 a n a kq r (a k ) q a r a r (mod m)
应用
性质1给出了一种将整除关系转变为同余式的法则


a ≡b(mod m) ←→ a-b ≡0(mod m) ←→ m | a-b

acm数学竞赛试题及答案

acm数学竞赛试题及答案

acm数学竞赛试题及答案# 题目一:数列问题问题描述:给定一个数列 \( a_1, a_2, a_3, \ldots, a_n \),数列中每个元素都是正整数,且满足 \( a_i = a_{i-1} + a_{i-2} \) 对于所有\( i \geq 3 \)。

如果 \( a_1 = 1 \) 且 \( a_2 = 1 \),请找出数列的第 \( n \) 项。

解答:根据题意,这是一个斐波那契数列。

第 \( n \) 项的值可以通过递归关系计算得出。

对于 \( n \) 的值,可以使用以下递归公式:\[ a_n = a_{n-1} + a_{n-2} \]其中,\( a_1 = 1 \) 和 \( a_2 = 1 \)。

因此,数列的前几项为 1, 1, 2, 3, 5, 8, 13, 21, ...。

对于任意的 \( n \),可以通过递归或动态规划方法计算出 \( a_n \)。

# 题目二:组合问题问题描述:从 \( n \) 个不同的元素中选择 \( k \) 个元素的所有可能组合的个数是多少?解答:这个问题可以通过组合数学中的二项式系数来解决。

从 \( n \) 个不同元素中选择 \( k \) 个元素的组合数 \( C(n, k) \) 可以用以下公式计算:\[ C(n, k) = \frac{n!}{k!(n-k)!} \]其中,\( n! \) 表示 \( n \) 的阶乘。

# 题目三:几何问题问题描述:在一个直角坐标系中,给定三个点 \( A(x_1, y_1) \),\( B(x_2, y_2) \) 和 \( C(x_3, y_3) \)。

如果 \( \overrightarrow{AB} \) 和 \( \overrightarrow{AC} \) 是垂直的,求证 \( A \) 是直角三角形 \( ABC \) 的直角顶点。

解答:如果 \( \overrightarrow{AB} \) 和 \( \overrightarrow{AC} \) 垂直,那么它们的数量积(点积)应该为零。

ACM必做50题的解题-模拟

ACM必做50题的解题-模拟
break;
}
return 1;
}
int main(){
int i,j,n;
char c;
scanf("%d",&n);
while(n--){
for(i=1; i<=3; i++)
scanf("%s %s %s",left[i],right[i],result[i]);
for(c='A'; c<='L'; c++){
1)选择合适的算法
对于每一枚硬币x逐个试探:
x比真币轻的猜测是否成立?猜测成立则进行输出。
x比真币重的猜测是否成立?猜测成立则进行输出。
2)选择合适的数据结构
以字符串数组存储称量的结果。每次称量时,天平左右最多有6枚硬币。因此,字
符串的长度需要为7,最后一位存储字符串的结束符’\0’,便于程序代码中使用字符串
{
int t,n;
cin>>t;
while(t--){
cin>>n;
int x,y;
int cross[SIZE];
memset(cross,0,sizeof(cross));
for(int i=0;i<n;++i){
cin>>x>>y;
int start,end;
if(x>y){
swapnum(x,y);
case 'u': if( strchr(left[i], x) == NULL) return 0;
break;
case 'e': if(strchr(right[i], x) != NULL || strchr(left[i], x) != NULL) return 0;

ACM竞赛之简单数论

ACM竞赛之简单数论

THANKS
感谢观看
欧拉函数及其应用
总结词
欧拉函数是一个用于描述一个数与它的正因数之间关系的函 数,它在示一个数n的正因数的个数,特别地,如果n是一 个质数,那么欧拉函数(n)的值为2。在ACM竞赛中,欧拉函 数常常用于解决一些与数的因数和因子分解相关的问题。
05
数论中的经典题目解析
最小。
数论应用
利用数论中的欧拉路径和欧拉回路 的知识,通过贪心算法和动态规划 解决最小生成树问题。
算法设计
通过数学推导和归纳,将问题转化 为数论中的数学问题,利用数论中 的结论和公式求解。
04
数论中的数学问题
费马小定理及其应用
总结词
费马小定理是数论中的一个重要定理,它提供了一种判断一个数是否为质数的 方法。
7等。
合数:一个大于1的自然 数,除了1和它本身外, 还有其他自然数能够整 除它的数。例如:4、6
、8、9等。
1既不是质数也不是合数 。
最大公约数与最小公倍数
01
最大公约数
两个或多个整数共有的最大的正 整数约数。
02
最小公倍数
两个或多个整数的最小的公倍数。
03
最大公约数与最小 公倍数的关系
两数的乘积等于它们的最大公约 数与最小公倍数的乘积。
输标02入题
中国剩余定理的基本思想是将一个线性同余方程组转 化为若干个简单的线性同余方程,然后分别求解,最 后再通过一定的方法得到原方程组的解。
01
03
中国剩余定理的应用范围很广,不仅在数论中有广泛 应用,在其他数学领域和计算机科学中也有很多应用。
04
在应用中国剩余定理时,需要先对方程组进行整理和 化简,然后选取适当的模数使得方程组满足中国剩余 定理的条件。

acm基础试题及答案

acm基础试题及答案

acm基础试题及答案1. 题目:给定一个整数数组,请找出数组中第二大的数。

答案:我们可以使用排序的方法,将数组从小到大排序,然后数组中的倒数第二个数就是第二大的数。

或者使用一次遍历的方法,首先初始化两个变量,一个用来存储最大值,一个用来存储第二大的值。

遍历数组,每次比较当前元素与最大值,如果当前元素大于最大值,则更新第二大的值为最大值,并将当前元素赋给最大值;如果当前元素小于最大值但大于第二大的值,则更新第二大的值。

2. 题目:实现一个函数,计算一个字符串中字符出现的次数。

答案:可以使用哈希表来实现,遍历字符串中的每个字符,将其作为键值对存储在哈希表中,键是字符,值是该字符出现的次数。

遍历结束后,哈希表中存储的就是每个字符出现的次数。

3. 题目:给定一个链表,删除链表的倒数第n个节点,并且返回新的链表头节点。

答案:可以使用双指针的方法,首先初始化两个指针,都指向链表的头节点。

然后移动第一个指针,移动n步,此时第一个指针指向倒数第n个节点的前一个节点。

接着同时移动两个指针,直到第一个指针到达链表的末尾,此时第二个指针指向的节点就是需要删除的节点的前一个节点。

然后更新第二个指针的next指针,使其指向第二个指针的next节点的next节点,最后返回链表的头节点。

4. 题目:编写一个函数,判断一个整数是否是回文数。

回文数是指正序和倒序读都一样的数。

答案:首先将整数转换为字符串,然后使用双指针的方法,一个指针从字符串的开始位置,一个指针从字符串的结束位置,向中间移动。

如果两个指针指向的字符不相等,则该整数不是回文数。

如果遍历结束后没有发现不相等的字符,则该整数是回文数。

5. 题目:给定一个字符串,找出其中不含有重复字符的最长子串的长度。

答案:可以使用滑动窗口的方法,维护一个哈希表记录窗口内字符的出现情况,以及一个变量记录不含有重复字符的最长子串的长度。

遍历字符串,每次移动窗口的右端点,如果当前字符不在窗口内,则更新最长子串的长度,并将字符添加到哈希表中。

ACM必做50题的解题-数学

ACM必做50题的解题-数学

ACM必做50题的解题-数学.txt36母爱是一缕阳光,让你的心灵即便在寒冷的冬天也能感受到温暖如春;母爱是一泓清泉,让你的情感即使蒙上岁月的风尘仍然清澈澄净。

POJ 2249 Binomial Showdown组合数学。

高精度,也可把分子分母的数组进行两两约分#include<iostream>using namespace std;double c(int c,int k){double a=1;int i,j=2;for(i=c;i>c-k;i--)a=a*i/(c-i+1);return a;}int main(){int n,k;while(scanf("%d%d",&n,&k)!=EOF && (n!=0 || k!=0)){if(k>n/2 )k=n-k;printf("%.0lf\n",c(n,k));}return 0;}poj 1023 the fun number system (经典进位制)题意:一种由2进制衍生出来的进制方法(我们暂且称为“类2进制”);标明'n'的位置上原2进制该位的权重要乘上-1,才是现在进制方法该位的权重;譬如说;pnp对于的能表示的数2来说就是 110;即1*2^2+(-1)*1*2^1+1*2^0=2;算法:这是数论中的进位制问题,我们可以仿照原来的求一个数二进制表示方法;但首先,我们应该考虑几个问题;①k位这种类2进制的表示范围;显然,当给出的'p','n'序列中,我们将所有p的位置都置为1其余位是0,此时最大;当我们将所有n的位置置为1,其余为0,此时最小;不过当我们求最大限max和最小限min时会有一个溢出问题;比如64位全是p的序列,那么max会溢出,值为-1;同理min在全是n 时也会溢出,为1;显然是max>=0,min<=1,溢出时产生异常,依次可以判断;②是否是最大限和最小限之间的数都能表示呢?都可以,而且能够表示的数是2^k个,这个原始2进制是一样的;因为每个位上要么是0,要么是1,而且每个位上的权重唯一的,不能通过其他位的01组合获得;最后,我们就可以仿照原始二进制来算在类2进制下的表示;不断求N的二进制最后一位和右移;如果取余是1,则该位上一定是1,如果该位对于字母为‘n’,则高位应该再加1;这里对2取余可能会出错,因为对于负数,补码的表示,最后一位一定是和原码一样的每次的右移后(有时需先加1)补码表示正好符合要求(可找实例验证);#include<iostream>using namespace std;__int64 N,M;char s[100],res[100]={'\0'};int main(){int T;scanf("%d",&T);int i,j;__int64 _max,_min;char ch;while(T--){scanf("%I64d",&N);scanf("%s",s);_max=0;_min=0;for(i=0;i<N;i++) //找出能表示的范围;{if(s[i]=='p') _max=2*_max+1,_min*=2;else _min=2*_min-1,_max*=2;}scanf("%I64d",&M);if((M<_min&&_min<=0)||(M>_max&&_max>=0)) puts("Impossible"); //注意防止64位数的溢出;else{memset(res,'\0',sizeof(res));for(i=N-1;i>=0;i--){int flag=0;if(M&1) //这里不能是平常的%2; {res[i]='1';if(s[i]=='n') flag=1;}else res[i]='0';M>>=1;if(flag) M++; //如果是n就需其高位加1;}printf("%s\n",res);}}system("pause");return 0;}POJ2506 Tiling 递推+高精给看似复杂的题找到了合适的规律就会变得简单。

【高中数学竞赛专题大全】 竞赛专题15 初等数论(50题竞赛真题强化训练)解析版+原卷版

【高中数学竞赛专题大全】 竞赛专题15 初等数论(50题竞赛真题强化训练)解析版+原卷版

【高中数学竞赛专题大全】 竞赛专题15 初等数论 (50题竞赛真题强化训练)一、填空题1.(2020·浙江·高三竞赛)将1~2020的数字按顺时针方向围成一个圆圈,然后从1开始,按顺时针依次隔一个数拿走,即拿走1,3,5,…,这个过程一直进行下去,直到剩下最后一个数字,则最后剩下的数字是___________. 【答案】1992. 【解析】 【详解】在第一轮中,从1开始到拿走1991,共取走996个数,此时余下1024个数, 1991后一项偶数为1992,此后共取10次,余下的数为1992, 故答案为:1992.2.(2021·全国·高三竞赛)关于x 、y 的方程11112007x y xy ++=的正整数解(,)x y 的个数为________. 【答案】48 【解析】 【详解】解析:由11112007x y xy ++=得2007200720070xy x y ---=,整理得 32(2007)(2007)2007200823223251x y --=⨯=⨯⨯⨯,从而,原方程的正整数解有(31)(21)(11)(11)48++++=(个). 故答案为:48.3.(2021·全国·高三竞赛){}n a 为正整数列,满足112,n a a +=为213133n n a a -+的最小素因子,12,,,,n a a a ,构成集合A ,P 为所有质数构成的集合,则集合P A 的最小元素为___________. 【答案】5 【解析】由于122,3a a ==,故2,3A ∈,所以集合P A -的最小元素5≥.假设存在正整数n ,使得5(3)n a n =≥,则211513133n n a a ---+,故()21512n a -++,这不可能,因为()212n a ++除以5的余数为1,3, 所以5P A ∈-.集合P A -的最小元素为5. 故答案为:5.4.(2021·全国·高三竞赛)质数p 和正整数m 满足32(2)1p m p m p ++=++,则p m +=___________.【答案】7 【解析】 【详解】由()221(1)p p m m +-=-,易见1m ,所以1p m -.设()1m kp k N +-=∈,则()2222,,(1)p p kp k p p k k p k k +=+==-.所以2k =,2,5p m ==,7p m +=.5.(2021·浙江·高三竞赛)已知集合{}12,,,n A a a a =⋅⋅⋅,n 为正整数.若对任意的1i j n ≤≠≤,i j a a -被4整除,但不被16整除,则n 的最大值为______.【答案】4 【解析】 【分析】 【详解】 考虑同余:对任意的1,i j i j n a a ≤≠≤-被4整除,则有(mod 4)i j a a k ≡≡,其中{0,1,2,3}k ∈, 而这类型的数模16的余数至多只有4种,所以n 最大值为4. 故答案为:4.6.(2021·浙江·高二竞赛)设数列123n n n a a a +⎡⎤⎡⎤=+⎢⎥⎢⎥⎣⎦⎣⎦,1n =,2,…,7这里[]x 表示不超过x的最大整数.若88a =,则正整数1a 有______种可能的取值情况.【解析】 【分析】根据高斯函数的性质,由88a =逐次往前求, 注意先定范围再验证,即可得到答案. 【详解】由88a =,可得710a =或11, 可得612a =或13或14; 可得515a =或16或17; 可得418a =或19或20或21; 可得322a =或23或24或25或26; 可得227a =或28或29或30或31或32;可得133a =或34或35或36或37或38或39,共7种.7.(2021·全国·高三竞赛)所有能使25n ⎡⎤⎢⎥⎣⎦为质数的正整数n 的倒数和为_________.【答案】3760【解析】 【分析】 【详解】1,2,3n =时,25n ⎡⎤⎢⎥⎣⎦都不是质数;4n =时,235n ⎡⎤=⎢⎥⎣⎦是质数;5n =时,255n ⎡⎤=⎢⎥⎣⎦是质数;6n =时,275n ⎡⎤=⎢⎥⎣⎦是质数.当8n ≥时,可设5n k r =±(其中k 为不小于2的正整数,0,1r =或2),则()22222111(5)2510(52)5555n k r k kr r k k r r =±=±+=±+, 所以2(52)5n k k r ⎡⎤=±⎢⎥⎣⎦.因为2k ≥,所以522k r ±>,所以2(52)5n k k r ⎡⎤=±⎢⎥⎣⎦不是质数.因此,能使25n ⎡⎤⎢⎥⎣⎦为质数的正整数n 只有4、5、6,它们的倒数和为1113745660++=.故答案为:3760. 8.(2021·全国·高三竞赛)若2020在p 进制下的各位数字之和为5p +,则质数p 的所有可能值为___________. 【答案】2,107 【解析】 【分析】 【详解】类似于在十进制下,我们有()()120|205p p --+⎡⎤⎣⎦, 于是()12014195|23p -=⨯⨯, 再注意p 为质数,就有2,3,107p =, 逐一验证得2p =或107p =. 故答案为:2,107.9.(2021·全国·高三竞赛)在1,2,3,4,…,1000中,能写成()221a b a N -+∈的形式,且不能被3整除的数有________个. 【答案】501. 【解析】 【详解】 设{}1,2,3,4,,1000S =,若221n a b =-+,则()3mod4n ≠.又()()2242211k k k =--+,()()2241111k k k +=+--+,()()22422121k k k +=+-+,因此,221n a b =-+当且仅当()3mod44n ≠.令(){|3mod44}A a S a =∈≡,(){|0mod3}B b S b =∈≡,则(){|3mod12}A B c S c ⋂=∈≡,因为250A =,333B =,84A B ⋂=,从而符合条件的数的个数为100025033384501--+=. 故答案为50110.(2020·浙江·高三竞赛)设a ,b ,c 为正整数,且2225548450a b c ab ac bc ++-+-=,则所有的解中a b c ++的最大值为___________. 【答案】30. 【解析】 【详解】配方得:222(22)50a c b a c ++--=(a ,c 等价). 注意到:22250017=++,22250055=++,22250345=++. 不妨设a c ≤且22b a c ≥+,(1)当22017b a c a c --=⎧⎪=⎨⎪=⎩,即1167a b c =⎧⎪=⎨⎪=⎩,此时116724a b c ++=++=.(2)当22055b ac a c --=⎧⎪=⎨⎪=⎩,即5205a b c =⎧⎪=⎨⎪=⎩,此时520530a b c ++=++=.(3)当22534b a c a c --=⎧⎪=⎨⎪=⎩,即3194a b c =⎧⎪=⎨⎪=⎩,此时319426a b c ++=++=.(4)当22435b ac a c --=⎧⎪=⎨⎪=⎩,即3205a b c =⎧⎪=⎨⎪=⎩,此时320528a b c ++=++=.(5)当22345b a c a c --=⎧⎪=⎨⎪=⎩,即4215a b c =⎧⎪=⎨⎪=⎩,此时421530a b c ++=++=.综上所述,所有的解中a b c ++的最大值为30. 故答案为:30.11.(2020·江苏·高三竞赛)设正整数a ,b ,c ,d 满足23a b =,45c d =,且303b d -=,则a c -的值为___________. 【答案】123801 【解析】 【详解】解析:由题意可得a =c =b 必为完全平方数,d 一定能开4次方.设2b n =,4d m =,则()()223101b d n m n m -=+-=⨯,且注意到3,101都是质数,则223031n m n m ⎧+=⎨-=⎩或者221013n m n m ⎧+=⎨-=⎩,解得52n =,7m =,则35123801a c n m -=-=. 故答案为:123801.12.(2020·江苏·高三竞赛)设,m n N ∈,,2m n ≥,若33333333213111213112n m n m ----⋅=++++,则m n +的值为___________. 【答案】6 【解析】 【详解】解析:因为3311(1)111(1)1n n n n n n n n --++=⋅++-+, 累乘可得原式22(1)1222(1)33(1)n n n n n n n n ++++=⋅=++,则232333323122211n n m n n m m ++==+++--, 故223232221n n n n m +-=++-, 从而可得()2326131816162(1)(2)(1)(2)n n m n n n n n n ++⎛⎫-==+=+ ⎪+--+-+⎝⎭, 则()()1218n n -+,且,2m n ≥,在()()12n n -+的值为6,9,18, 故4n =,2m =.故6m n +=. 故答案为:6.13.(2021·浙江·高三竞赛)将顺序为1,2,…,2020的2020张卡片变成1011,1,1012,2,…,2020,1010的顺序,即原先的前1010张卡片移至第2,4,…,2020张,这称为一次操作.若从顺序1,2…,2020开始操作,则至少经过______次操作可以恢复到初始顺序. 【答案】1932 【解析】 【分析】 【详解】记第1i 次调整前的位置为i a ,调整后的位置记为1i a +,初始位置记为0a ,则112,101022021,1010i i i i a a a a a +≤⎧=⎨->⎩,所以102(mod 2021)2(mod 2021)n i i n a a a a +≡⇒≡, 因20214347=⨯,所以(2021)(43)(47)1932ϕϕϕ==, 所以193221(mod 2021)≡,要恢复原样,则0n a a =, 所以1932n =. 故答案为:1932.14.(2019·广西·高三竞赛)满足y =(x ,y )有____________ 对. 【答案】6 【解析】 【详解】设2251,2019,,n x m x n N m N =+=+∈∈. 224()()19682341m n m n m n -=+-==⨯⨯,由(m +n )与(m -n )奇偶性相同,可知它们同为偶数,且(m +n )>(m -n ) 实数对(m +n ,m -n )所有可能的取值共有6对:()32341,2⨯⨯,()322341,2⨯⨯,()32341,2⨯⨯, ()3241,23⨯⨯,()22241,23⨯⨯,()3241,23⨯⨯.由有序数对(x ,y )与(m +n ,m -n )一一对应,可知所求正整数对为6对. 故答案为:6.15.(2019·四川·高三竞赛)若正整数n 使得方程33n x y z +=有正整数解(x ,y ,z ),称n 为“好数”.则不超过2019的“好数”个数是_____ . 【答案】1346 【解析】 【详解】首先易知若n 为“好数”,则n +3也是“好数”又显然1、2是“好数”,从而当1,2(mod3)n ≡时,n 均为“好数”. 由费马(Fermat )大定理知:333x y z +=无正整数解,即3不是“好数”.于是n =3k (k ∈N *)都不是“好数”.否则,存在k ∈N *,使得3k 是“好数”,即方程333k x y z +=有正整数解(x ,y ,z 0),从而333x y z +=有正整数解()000,,kx y z ,矛盾!故当且仅当n 满足1,2(mod3)n ≡时,n 为“好数”. 所以,不超过2019的“好数”个数是2201913463⨯=. 故答案为:1346. 二、解答题16.(2021·全国·高三竞赛)求证:对于正整数n ,令22n a ⎡⎡=+⎣⎣,数列{}n a 中有无穷多个奇数和无穷多个偶数([]x 表示不超过实数x 的最大整数). 【答案】证明见解析 【解析】 【详解】1212101100.101100bb c c =⋅⋅⋅=⋅⋅⋅⋅, 其中{}{}0,1,0,1i i b c ∈∈.用反证法,先证明数列中有无穷多个偶数.假设,数列中只有有限个偶数,那么存在整数N ,n N ∀>,n a 是奇数, 则存在正整数M ,使得1212101100101100M n M a bb b c c c =+,且当n M >时,{},{0,1}n n b c =,12(2)110110011N d d d ⋅∈Q ,矛盾!同理可证明数列中有无穷多个偶数.所以数列{}n a 中有无穷多个奇数和无穷多个偶数.17.(2021·全国·高三竞赛)使得A =n 为_________. 【答案】1或11##11或1 【解析】 【详解】,,,(,)1aa b a b b+=∈=N ,则222222222917647799n a a b b n n b b a b a -+=⇒==-++--. 又(,)1a b =,所以()()22222,9,1b b a b a -==,故22964b a -,所以229(3)(3){1,2,4,8,16,32,64}b a b a b a -=+-∈,229b a -模3余2,故2298b a -=或32,故3831b a b a +=⎧⎨-=⎩或3432b a b a +=⎧⎨-=⎩或33231b a b a +=⎧⎨-=⎩或31632b a b a +=⎧⎨-=⎩或3834b a b a +=⎧⎨-=⎩,所以(,)(1,1)=a b 或(7,3),因此n 为1或11. 故答案为:1或11.18.(2021·全国·高三竞赛)设n 是正整数,12,,,k d d d 是n 的全部正因数.定义1212()(1)(1)(1)k d d d k f n d d d =-+-++-,已知()f n 是2的幂次,求证:n 没有1之外的平方因数.【答案】证明见解析 【解析】 【分析】设2(1)rn s r =≥,其中1i tai i s p ==∏,利用因数和函数可得()f n 与各质因数的关系,再根据()f n 是2的幂次结合反证法可得1i a =,从而可n 没有1之外的平方因数. 【详解】用()n σ表示n 的正因数之和.如果n 是奇数,则()()0f n n σ=-<,舍去. 当n 是偶数时,设2(1)r n s r =≥,其中1i tai i s p ==∏(i p 为n 的奇质因数,i a +∈N ,3i p ≥).所以()()()111()2221()23i ta rr r i i f n s p σσ-+==+++-=-∏.其中()21i i a a i i i i p p p p σ=++++,因为()f n 是2的幂次,所以1231,1r r +-==,每个()i ai p σ是2的幂次,且i a 是奇数,又()()()12246111i i i a a a i i i i i i i i i p p p p p p p p p σ-=++++=++++++,故1246,11i a i i i i i p p p p p -++++++均为4的倍数,因为23,1(mod 4)i i p p ≥≡,所以如果1i α>,则1241,,,,i a i i i p p p -这些数的总个数是4的倍数,所以12211i a i i i p p p -++++.因为212(mod 4)i p +≡,所以121i a i i p p -+++不是2的幂次,于是1i a >不成立.所以1i a =,所以1ti i s p ==∏(i p 为互异的奇质因数),12ti i n p ==∏,可见n 没有非平凡的平方因数. 【点睛】思路点睛:竞赛中与正因数和有关的问题,多用因数和函数来分析处理,令注意利用因数分解定理把因数问题转化为即质因数的问题来处理.19.(2021·全国·高三竞赛)用()P n 表示正整数n 的各位数字之和,求所有这样的三位数n ,使得满足:1(3)()3P n P n +=.【答案】117、207、108. 【解析】 【分析】 【详解】由于(),(3)P n P n +都是正整数,则据条件,()P n 是3的倍数,因此n 与3n +都是3的倍数. 设n abc =,且数n 加3后必须产生进位,则7c ≥.(因为,如果6c ≤,则数n 加3后不会产生进位,于是(3)()3()P n P n P n +=+>,矛盾)并且b 不能是9,这是因为,若9b =,则当9a =时,99n c =,数n 加3后成为1100c ,1{0,1,2}c ∈,这时1(3)()3P n P n +<.当9a <时,9n a c =,若1113n a b c +=,则1111,0,310a a b c c =+==+-. 由3(3)()P n P n +=,得3[(1)0(310)]9a c a c ++++-=++, 即2()27a c +=,矛盾!所以9b <.今由3[(1)(310)]a b c a b c ++++-=++得9a b c ++=,其中1,7,8a c b ≥≥≤, 依次考虑c 、a 、b 的取值,得到三个数:117、207、108,验证知,它们皆合题意. 20.(2021·全国·高三竞赛)已知a 、b 、c 、d 是不同的正整数,且满足a b c da b b c c d d a+++++++是整数,求证:+++a b c d 不是质数. 【答案】证明见解析. 【解析】 【分析】 【详解】 由1a b c d a b c da b b c c d d a a b c d a b c d a b c d a b c d +++>+++=++++++++++++++++, 且a b c da b b c c d d a+++++++ 1111b c d aa b b c c d d a=-+-+-+-++++ 43b c d a a b b c c d d a ⎛⎫=-+++< ⎪++++⎝⎭,所以2a b c d a b b c c d d a+++=++++, 故2a c b d c aa b c d b c d a b c d a+=--=+++++++, 因此1111a c a b d a b c c d ⎛⎫⎛⎫-=- ⎪ ⎪++++⎝⎭⎝⎭, 所以()()()()d b d b a c a b d a b c c d --⋅=⋅++++且d b ≠, 所以()()()()a b c c d c a b d a ⋅++=⋅++,即22ac abd a c bcd +=+. 整理得()()0ac c a bd a c -+-=且a c ≠,所以ac bd =. 假设p a b c d =+++是质数,则 2()a a b c d a ab ac ad +++=+++ 2a ab bd ad =+++ ()()a b a d ap =++=,所以()p a b +或()p a d +,而,p a b p a d >+>+,矛盾. 综上+++a b c d 不是质数.21.(2021·全国·高三竞赛)解关于实数x 的方程:{}202020201arctank x x k==∑(这里{}[][],x x x x =-为不超过实数x 的最大整数) 【答案】{}0 【解析】 【分析】【详解】(1)当0x <时,{}202020201arctan 0(1,2,,2020),arctan 0k x x k x k k =<=<≤⋅⋅⋅∑,此时原方程无解.(2)当0x =时,有{}202020001arctan0k x x k===∑. (3)当01x <<时,令arct ()1)2an (0x xf x x =-<<,则211()0(01)12f x x x '=-><<+, 故()f x 在()0,1上递增.有()()00f x f >=,即arctan 2x x > 于是,此时{}202020204202020201111125arctan 2224k k k x x x xx x x k k k =====>>=>∑∑∑,即1x >,矛盾.故无解.(4)当1≥x 时,注意到111123tan(arctan arctan )112316++==-, 且由110arctan arctan arctan1arctan1232π<+<+=,知11arctan arctan 234+=π.则{}20202020202011111arctan arctan arctan1arctan arctan 1232k k x x k k π===≥>++=>∑∑,与{}202001x <<,矛盾.故此时无解.由(1)(2)(3)(4),知原方程的解集为{}0.22.(2021·全国·高三竞赛)两两不等的实数x 、y 、z 满足222(2)(2)(2)y x z y x z ⎧=-⎪=-⎨⎪=-⎩,求x y z ++.【答案】5或6. 【解析】 【分析】 【详解】由原方程变形可得到1(1)(3)1(1)(3)1(1)(3)y x x z y y x z z -=--⎧⎪-=--⎨⎪-=--⎩和4(4)4(4)4(4)y x x z y y x z z -=-⎧⎪-=-⎨⎪-=-⎩,又由x 、y 、z 两两不等知,,1,4x y z ≠, 于是()()()3331x y x xyz ---==.令,p x y z q xy yz zx =++=++,化简得39p q =+. 另一方面,原方程三式相加得2(2)412p p q p =--+, 化简得25122p p q -+=,联立就有26530p p p =-+,即5p =或6. 最后,当22224cos 744cos 784cos 7x y z ππ⎧=⎪⎪⎪=⎨⎪⎪=⎪⎩时可以取到5,当2224cos 924cos 944cos 9x y z πππ⎧=⎪⎪⎪=⎨⎪⎪=⎪⎩时可以取到6.23.(2021·全国·高三竞赛)若关于z 的整系数方程320z pz qz r +++=的三个复数根在复平面内恰好成为一个等腰直角三角形的三个顶点,求这个等腰直角三角形的面积的最小值. 【答案】1 【解析】 【分析】 【详解】设该等腰直角三角形斜边中点对应的复数为1z ,直角顶点对应的复数为()1220z z z +≠, 则另外两个顶点对应的复数分别为12z z i +和12z z i -,依题意有: 32121212()()()z pz qz r z z z z z z i z z z i +++=-----+,化简得223223111221112223,32,z x z p z z z z q z z z z z z r +=-++=+++=-,所以3222221223,489z z q p Z z z pq r Z =-+=-∈∈.进而122z z Q +∈,与123z z p Z +=-∈联立就有2z Q ∈.再由22223x q p Z =-∈知2z Z ∈,于是21z ≥,所以等腰直角三角形的面积最小为1.另一方面,3210z x z +++=的三个复数根恰是面积为1的等腰直角三角形的顶点. 24.(2021·全国·高三竞赛)证明:存在无穷多个奇数n ,使得!1n +是合数. 【答案】证明见解析 【解析】 【分析】 【详解】证明当奇数(3)n n ≥时,!1n +与(!)!1n n -+不均为质数即可: 用反证法,若!1n +为质数,设!1n p +=,则结合威尔逊定理可得: 111(!)!(1)!(1)!(1)(2)()(mod )n n p n p n p ----=--≡----1(1)!(1)1(mod )n n n p +≡--⋅≡--≡-,此时有(!)!1n n -+为合数,而n 奇数得!n n -也是奇数, 从而存在无穷多个奇数n ,使得!1n +是合数.25.(2019·山东·高三竞赛)已知4239n n -+是素数,求正整数n 的所有可能值 【答案】n =1,n =2 【解析】 【详解】因为()()4222393333n n n n n n -+=++-+,所以或n 2-3n +3=1,解得n =1,2.将n =1,n =2代入检验均满足题意,所以n =1,n =2为所求.26.(2021·全国·高三竞赛)求方程(31)(31)(31)34x y z xyz +++=的所有正整数解(,,)x y z . 【答案】(,,)(28,5,2),(11,7,2)x y z =或其排序,共12组解. 【解析】 【详解】 不妨设x y z ≥≥.若z >31z +<.同理,31,31x y +<+<. 三式相乘得(31)(31)(31)34x y z xyz +++<,与原方程矛盾. 于是,5z ≤<. (1)若1z =,则4(31)(31)346()20x y xy xy x y ++=⇒+++=.显然,无正整数解.(2)若2z =,则7(31)(31)68521()70(521)(521)x y xy xy x y x y ++=⇒-+-=⇒--=24762717=⨯⨯.只有47611941434=⨯=⨯,才有对应的正整数,x y ,此时(,)(28,5)x y =或(11,7). (3)若3z =,则10(31)(31)102615()50x y xy xy x y ++=⇒-+-=.两边取模3即知矛盾,故无解. (4)若4z =,则13(31)(31)1361939()130x y xy xy x y ++=⇒-+-=3(1939)(1939)176821317x y ⇒--==⨯⨯.故此时(1939)42y -≤,故39y ≤≤,逐一检验后无解. 综上,(,,)(28,5,2),(11,7,2)x y z =或其排序,共12组解.27.(2021·全国·高三竞赛)求方程||1r s p q -=的整数解,其中p 、q 是质数,r 、s 是大于1的正整数,并证明所得到的解是全部解. 【答案】证明见解析 【解析】 【详解】容易看到两个质数中肯定有一个为2,不妨假设2,21r sp q =-=,即21r s q -=±.若21r s q =+,从余数去讨论,3(mod4)q ≡,s 为奇数.()1221(1)1rss s q q qq--=+=+-++,所以121212,12,r r s s q q q --⎧+=⎨-++=⎩()1111111(1)(1)(2)2211222222sr sr s r r r s r s r r s s s s ---⎡⎤=-+=-++=-++⎣⎦,从奇偶性可以看出这种情形方程无解.若21r s q =-为偶数,注意到()1221(1)1r s s q q q q --=-=-+++,所以121212,12,r r s s q q q --⎧-=⎨+++=⎩()11111(1)21221122(1)22sr sr s r r r r s s s s --=+-=+++-+.令2u s v =,其中v 为奇数,则 ()11111(1)21221122(1)22sr sr s r r u r u r s v s v --++=+-=+++-+,观察最后一项,则v 为1,故2u s =,所以221ur q =-,故()()1122211u u r q q --=-+,故1112221212u u r r q q --⎧-=⎪⎨+=⎪⎩,所以12222r r +=,所以121,2r r ==,1u =, 所以3q =,3r =,2s =,综上,考察到对称性,原方程恰有两组解:3,2,2,3.p q r s =⎧⎪=⎪⎨=⎪⎪=⎩或2,3,3,2.p q r s =⎧⎪=⎪⎨=⎪⎪=⎩ 28.(2021·全国·高三竞赛)证明:对任意正整数N ,都存在正整数n N >和n 个互不相同的正整数12,,,n x x x ,使()222222121220202020n n x x x x x x -++++是完全平方数.【答案】证明见解析 【解析】 【详解】对于3m ≥,必存在不同的正整数12,,,m x x x 满足2221212m m x x x x x x S =++++,令{}112121max ,,,m m m x x x x x x x +=->,则有()21211212m m m m x x x x x x x x x x +=-()2121211m m x x x x x x =-+-()()2222121211m m x x x x x x S =-++++-22221211m m x x x x S +=++++-.以此类推,当504S >时,存在不同的正整数11504,,,,,m m m S x x x x ++-满足2221250412504504m S m S x x x x x x +-+-=++++.存在6N ≥,定义(1)k x k k N =≤≤,则()2221212504N N x x x x x x -+++>.由前述结论可得存在n N >使得()2221212504n n x x x x x x -+++=,此时()2222222222121212122020202020201010n n n n x x x x x x x x x x x x -++++=-+()2121010n x x x =-为完全平方数.29.(2021·浙江·高三竞赛)已知素数p ,q 满足21p q =+.证明:存在正整数m 使得mp 的十进制表示的各位数字之和是2或3. 【答案】证明见解析 【解析】 【分析】 【详解】2p =,3不合题意,若5p =则取110mp =即可.下面假设7p ≥.由费马小定理()()12101101101101p q q q p --=-=+-可知101q p +或101q p -.前者意味着取101q mp =+满足条件.若是101qp -,我们断言{}012110,10,10,,10q A -=⋅⋅⋅中的数模p 两两不同余,即有q 个不同的余数.这是因为若有()1010mod a b p ≡,(01a b q ≤<≤-)则()101mod b a p -≡,由b a -与q 互素以及裴蜀定理知存在正整数u ,v 使得()1u b a vq --=,这样 ()()()1110101010mod uvb a vq q p -+≡==⨯.这意味着1019p -=即3p =,不合题意因此{}012110,10,10,,10q A -=⋅⋅⋅中的数模p 两两不同余.设它们的余数是{}{}12,,,1,2,,1q B r r r p =⋅⋅⋅⊆⋅⋅⋅-. 我们考虑下面的52p -个余数对,它们覆盖了除了0,1,12p -,2p -,1p -之外的所有余数:()2,3p -,()3,4p -,…,31,22p p -+⎛⎫⎪⎝⎭ 若某个对子的两个余数都在B 中出现,不妨设10a k ≡,101b p k ≡--,则10101a b mp =++是p 的倍数,满足题意.若每个对子中的余数都在B 至多出现一个的话,由于12p B -=,所以0,1,12p -,2p -,1p -在B 中出现至少两个,已知1B ∈,0B ∉,其余三个余数12p -,2p -,1p -至少有一个在B 中出现. 若12p B -∈,即有某个1102a p -≡,则2101a mp =⨯+满足题意.若2p B -∈,即有某个102a p ≡-,则102a mp =+满足题意. 若1p B -∈,有某个101a p ≡-,则101a mp =+满足题意. 综上所述,存在p 的倍数的十进制数字和是2或3.30.(2021·全国·高三竞赛)设m 是一个给定的正整数,d 是它的一个正因子.已知{}0i i a ∞=和{}0i i b ∞=是两个由正整数构成的等差数列,满足:存在正整数i 、j 、k 、l ,使得()(),1,,ijkla b a b m ==.证明:存在正整数t 、s 使得(),t s a b d =.【答案】证明见解析 【解析】 【分析】 【详解】注意到m 可逐次除以它们若干素因子得到d ,这样只需证对m 的任意素因子p ,存在正整数α、β,使得(),ma b pαβ=. 由于(),k t a b m =,故k a p 、l b p 必有一项不能被m 整除.不妨设k ab不能被m 整除. 设等差数列{}i a 、{}j b 的公差分别为u 、v ,则0i a a iu =+,0j b b jv =+. 下面分两种情况:(1)若p v .令,k a k l p αβ==+.这时k l a vb b pβ=+. 注意到k m ma b p pβ、,又p v 且k a m p ,所以m b β.这说明m p 是a α、b β的公因子,且m 不是它们的公因子.设q 是a α、b β的一个不同于p 的公因子,则q a α、q b β、a qpα. 故,a q a b v p ααβ⎛⎫- ⎪⎝⎭,即(),k t q a b m =.又p q ,故mq p .故(),m a b p αβ=.(2)若p v .先证p u . (*)事实上,假设p u ,由(),k l a b m =知00,k l p a ku a p b lu b -=-=.因此,i j p a p b ,这与(),1ija b =矛盾!故(*)得证.取正整数s ,使得l s b p能被mp 整除,但不能被m 整除. 令,l sb k l p αβ=+=.这时,l kl s b a a u b b p αβ=+=. 注意到k m a p 、l m b p、lsb m p p ,所以m p 是a α与b β的公因子.又lsb m p ,且p u ,所以m a α,从而m 不是a α、b β的公因子.设质数q 是a α,b β不同于p 的公因子,则q b β,l k sbq a u a p α⎛⎫-= ⎪⎝⎭. 即(),k l q a b m =. 又q p ≠,所以mqp.这说明(),m a b p αβ=.由(1),(2)知结论成立.31.(2021·全国·高三竞赛)设多项式02()()(2)==+≥∑dii i P x a x a d 的系数为正整数.定义数列{}n b :()101,(1)n n b a b P b n +==≥.证明:对于任意的整数2n ≥,均存在质数p ,使得n p b ,且()121,1n p bb b -=.【答案】证明见解析 【解析】 【分析】 【详解】假设存在整数2n ≥,使得n b 的任意一个质因子均为某个(11)i b i n ≤≤-的因子(对于n b 的不同的质因子,i 的取值可以不同).令p 为n b 的一个质因子,且rn b p l =,其中,,(,)1r l p l +∈=N . 则110012()()(mod )dr i r n n i i b P b a p l a a b p ++===+≡=∑假设()1mod ,r n i i b b p i +++≡∈N 成立,则()()()111mod r n i n i i i b P b P b b p +++++=≡=.所以由数学归纳法知对任意的正整数i ,均有()1mod r n i i b b p ++≡.进而有()12mod r n n kn b b b p +≡≡≡,所以1r kn n p b b +-.定义()p V m 表示正整数m 的标准分解中所含的p 的幂次数, 由()p n V b r =,得()p kn V b r =.令i p b 对某个(11)i i n ≤≤-成立,同上可证()()()23p i p i p i V b V b V b ===.于是()()()p n p in p i V b V b V b r ===.从而,若p 为n b 的一个质因子,则它在n b 的中的次数等于在某个(11)i b i n ≤≤-中的次数. 所以121n n b bb b -,进而121n n b b b b -≤.由()211n n n b P b b --=>,得21kn n k n b b b --<,所以111211n i n n i nn i i b bb ---==<<∏∏,矛盾,故原命题成立.32.(2021·全国·高三竞赛)一个大于1的整数m ,如果对所有的正整数n ,都存在正整数x 、y 、z ,使得222n mx y z =--,则称m 为上数,否则称为下数.试问:是否存在无数多的上数?是否存在无数多的下数?【答案】存在无数多个上数也存在无数多个下数. 【解析】 【分析】 【详解】存在无数多个上数也存在无数多个下数.首先,存在无数多个下数.考查93m k =+,其中k 为正整数.考查不定方程2226(93)k x y z =+--,若存在解x 、y 、z 则220(mod 3)y z ≡+, 故有()0mod3y z ≡≡,所以2222(93)36(mod 9)k x y z x +--≡≡,即2(mod3)x ≡,矛盾.故无解. 即所有的93k +为下数.其次,我们证明存在无数多个上数,我们考查21c +,其中222c a b =+(a 、b 、c 为勾股数).(1)注意到22222(1)(1)21c x c x x x +---=-,可知所有的奇数1n >,均存在解. 又22211c a b =+--,可知所有奇数均存在解.(2)对于n 为偶数的情形,考查222222(1)(1)(2)4454(2)9c x cx x c x c c x c +---+-=-+-=---. 令c 为奇数,故有24(2)9x c ---可以为所有模4余2的数. (3)而对于4|n ,可以转为考查2224222n x y z m ⎛⎫⎛⎫⎛⎫=-- ⎪ ⎪ ⎪⎝⎭⎝⎭⎝⎭的问题,不断转化.终会归为(1)或是(2)其中的一类.而存在无数多个勾股数a 、b 、c (a 、b 、c 互质),即存在无数多个满足题意的21c +. 即有无数多个上数.33.(2021·全国·高三竞赛)如果正整数n 满足存在正整数a 、b 、c 使得()()()()()(),,,,,,n b c a bc c a b ca a b c ab =⋅+⋅+⋅,则称n 为好数.求证:存在连续2020个正整数这2020个正整数都是好数.注:对于正整数x ,y ,(),x y 表示x ,y 的最大公因数. 【答案】证明见解析 【解析】 【分析】 【详解】取121111121,(2),1,(2)(2,3,,2020)i i i l i i l x y x x x y y x x i -===+=-⋅⋅⋅=+=∏.对2,3,,2020i =,由()()1,1,21i i i i x x x x +=++=,知,2i i x x +均与121,,,i y y y -互质,故i y 与121,,,i y y y -均互质.则122020,,,y y y 两两互质.对1,2,3,,2020i =,考查i y 的一个倍数,设为()22i i i n my mx x ==+.注意到取2,,i i i a mx b mx c x ===,则有()()()()()(),,,,,,n b c a bc c a b ca a b c ab =⋅+⋅+⋅. 故n 为好数.则由n 的任意性,知i y 的一切倍数均为好数. 注意到122020,,,y y y 两两互质,那么由中国剩余定理知关于x 的同余方程组()()mod 1,2,,2020i x i y i ≡-=有正整数解0x .这意味着对1,2,3,,2020i =,有0x i +是i y 的倍数,因此0x i +是好数. 取()01,2,,2020x i i +=即可满足题意.34.(2021·全国·高三竞赛)设函数:f N N ++→同时满足以下三个条件: (1)对任意x 、y N +∈,有()()()f xy f x f y =; (2)对任意x N +∈,有()()f f x x =; (3)()220()20f x x x ≠≤≤. 求()2f 的最小值. 【答案】1013. 【解析】 【分析】 【详解】在()()()f xy f x f y =中令1x y ==,得()11f =.①设质数p 满足()f p 不是质数,若()1f p =,则由(2)及①, 有()()()11p f f p f ===,矛盾.故()f p 为合数,设()f p xy =(x ﹐y 均为大于1的正整数), 则()()()()()p f f p f xy f x f y ===.不妨设()1f x =,则()()()11x f f x f ===,与1x >矛盾. 因此,若p 是质数,则()f p 也是质数.由(1)、(2),有()()()()()()222222f f f f f f ==, 则由()22f 是偶数以及(3),得()222022f ≥. 因为()2f 是质数,所以()21013f ≥.另一方面,设小于2020的且不等于2或1013的质数有t 个,从小到大依次为12t p p p <<⋅⋅⋅<, 大于2020的质数中,最小的t 个从小到大依次为12t q q q <<⋅⋅⋅<考虑如下定义的函数:f N N ++→:()()()()()()11,21013,10132,,1,2,,i i i i f f f f p q f q p i t ======,且对质数t p q >,有()f p p =.对于合数1i ki i y r α==∏,其中质数12k r r r <<⋯<,且12k N ααα+⋯∈、、、,12k i i α=≥∑,有1()(())i ki i f y f r α==∏. 此时,不难验证f 满足(1)、(2).且对于正整数()22020x x ≤≤,若x 为质数,显然()f x x ≠,若x 是合数,设1jlj j x s β==∏,其中质数12l s s s <<⋯<,且121,,,,2ll j j N ββββ+=∈≥∑.于是,由f 的定义知()f x 一定为至少两个,且每个均不小于1013的正整数的乘积, 故()2020f x x ≥≥,则f 满足(3). 综上,知()2f 的最小值为1013.35.(2021·全国·高三竞赛)对每个正整数n ,定义()f n 为从1到n 中所有与n 不互质的正整数的和.求证:若()()f m f n =且m n ≠,则m n -是合数. 【答案】证明见解析 【解析】 【分析】 【详解】首先计算()f n 的表达式,注意到从1到n 中所有与n 互质的正整数有()n ϕ个,并且它们是以t 和n t -的形式成对出现的,因此111()(1)()(1())222f n n n n n n n n ϕϕ=+-⋅=+-.若()()f m f n =且m n ≠,不妨设m n >,则()()()()11m m m n n n ϕϕ+-=+-.① 因为()11n n n m ϕ≤+-≤<,所以(),1m n >.若m n -不为合数,设为质数p ,则()1n kpm p k ==+﹐, ①式变为()()()()()()11111k k p k p k kp kp ϕϕ+++-+=+⎦-⎡⎤⎣.由(),11k k +=,可设()()()()()111,11k p k p lk kp kp l k ϕϕ++-+=+-=+ 其中0l p <<,相减得()()()1k p kp p l ϕϕ+-=+,1k =时, ()()21p p p l ϕ--<+不合题意,所以2k ≥,2p =时,()()()1,1l k p kp p l ϕϕ=+-=+左右奇偶性不同,所以3p ≥.注意()()()()()1,11p kp p k p ϕϕ--+,因此()()1|p p l -+.又0,3l p p <<≥,所以2l p =-,所以()()()121,23k p k p kp k p ϕϕ+=++=-+. 若|p k ,则()|p kp ϕ,所以()3|2p k p -+,所以3p =, 所以()()()12121k p k k p ϕϕ+=+<++,矛盾,同理若()1|p k +也得矛盾,所以()()1121p k k p ϕ-+=++,()()123p k k p ϕ-=-+,②所以()()12k k ϕϕ+-=,于是()1k ϕ+和()k ϕ恰有一个不是4的倍数,必模4余2,但()s ϕ模4余2当且仅当4,,2a a s q q =,这里q 是模4余3的奇质数,a 是正整数,分别代回②知都无解.综上,若()()f m f n =且m n ≠,则m n -是合数.36.(2021·全国·高三竞赛)已知正整数,1n n >,设A 为正整数满足2|1n n A ⎡⎤+⎢⎥⎣⎦,求所有A 的值.([]x 表示不超过x 的最大整数)【答案】当2n =时,3A =,或4,当2n >时,1A n =+. 【解析】 【分析】 【详解】(1)如果2A n >,则211n A ⎡⎤+=⎢⎥⎣⎦,由1n >知,2 1n n A ⎡⎤+⎢⎥⎣⎦;(2)如果2A n =,则212n A ⎡⎤+=⎢⎥⎣⎦,由21n n A ⎡⎤+⎢⎥⎣⎦∣及1n >知2n =,从而4A =;(3)如果20A n <<,则令22n n A r A ⎡⎤=+⎢⎥⎣⎦,其中20r A n ≤<<,即221()n n A A r A ⎛⎫⎡⎤=+-- ⎪⎢⎥⎣⎦⎝⎭. ①当2n A n <<时,222,11n n n n n A A A ⎡⎤⎡⎤<<+<+⎢⎥⎢⎥⎣⎦⎣⎦,由21n n A ⎡⎤+⎢⎥⎣⎦∣,可设21n nH A ⎡⎤+=⎢⎥⎣⎦, 于是1nH n <+,即()11n H -<,这样,只有1H =成立,所以21n n A ⎡⎤+=⎢⎥⎣⎦.代入①式得()2n nA A r =--,即21111n r r A n n n --==+---. 若1r ≠,则11r n --是不小于1的正整数,于是A n ≤,与A n >矛盾, 因此1r =,故1A n =+.当A n =时,211n n A ⎡⎤+=+⎢⎥⎣⎦,由n ∈+N 知211n n n A ⎡⎤+=+⎢⎥⎣⎦;当0A n <<时,由①式及21n n A ⎡⎤+⎢⎥⎣⎦∣知,n A r -∣. 又0,0A n r A n <<≤<<,从而0A r n <-<,矛盾. 综上,当2n =时,3A =,或4,当2n >时,1A n =+.37.(2021·全国·高三竞赛)证明:对任何正整数m ,存在无穷多组整数(),x y ,使得 (1),x y 互质; (2)2|x y m +; (3)2|y x m +. 【答案】证明见解析. 【解析】 【分析】 【详解】显然,当1x y ==时,符合题意.若正整数对()(),x y x y ≤满足条件,由条件(2)可设2xx y m '=+,其中x Z +'∈.下证命题:正整数对(),y x '也满足条件,且y x <'. 由等式2xx y m '=+知,2xx y yx '>≥,即x y '>. 同时还可知,2|x y m '+且()cd ,|g x y m '.若p 是()gcd ,x y '的一个质因子,则有,p m p y .结合条件(3)有2|p x m +,从而有|p x . 这与条件(1)矛盾.故()gcd ,1x y '=.最后,还需证2yx m '+∣.由于gcd(,)1x y =,等价证()22y x x m '+∣. 其中()()()2222220(mod )x x m y m x m m m x y '+=++≡+≡.命题得证,且x y x '>≥.反复利用此命题,便可得到无穷数列{}n a ,其中()212211,n n n a m a a a n a ++++===∈N . 满足1n n a a +>对2n ≥成立,且整数对()()1,n n a a n ++∈N 符合条件.38.(2021·全国·高三竞赛)正整数2n ≥,且n 的素因子个数不超过2,对于任意整数a ,若(),1n a =,则有()mod n a a n ≡成立,求证:n 是质数.【答案】证明见解析. 【解析】 【分析】 【详解】假设n p q αβ=,(其中p q 、均为质数,N αβ∈﹐). 首先证明:p q ≠,若n p γ=(p 为质数,γαβ=+).因为(),1n a =,所以取最小整数δ,使得()1mod a p δγ≡(易知δ为a 对模2p 的阶).又()111(mod )1mod n n an a p γ--≡⇔≡,所以()()1(1),(1)1p p p n p γγγδϕδδ-=--⇔-∣,所以1p δ-∣. 取()()()11111111(1)11mod p p a p p a p p p p p γγγγγγ------=--⇒≡-≡--+≡+,矛盾.所以n p p q γ≠⇒≠.任取与p q 、互质的a , 由Euler 定理知:()()1(mod ),()(1)(1)n an n p q p q ϕαβϕϕ≡==--.从而()()1|1p q δ--,又因为()|(1)|1n p q αβδδ-⇒-,所以()11111p q p q p q αβαβαβδ----+--∣.所以111111(mod )p qp q p q a n αβαβαβ----+--≡,所以()111mod p q a p αβα--≡,所以()111mod q p q a p αα--≡.同理()111mod p q aq αββ--≡.不妨设p q >,则p 一定是奇质数.因此它存在原根g ,满足()11mod q gp α-≡/.因此,一定存在整数k ,使得q kp g α+,取a kp g α=+,矛盾! 结合2n ≥,知n 只能有一个质因子,即n 是质数. 又由Fermat 小定理知,当n 为质数时,满足题意.39.(2021·全国·高三竞赛)设a ,b 为正奇数,定义数列{}n f 如下:1f a =,2f b =,当3n ≥时,n f 为12n n f f --+的最大奇因子.求证:当n 充分大时,n f 为常数,并确定出这个常数. 【答案】a ,b 的最大公约数. 【解析】 【详解】从题目条件可以知道,如果有相邻两项k f ,1k f +相等,则当n k ≥时,n f 全相等,为常数. 用反证法,如果n f 不为常数,则序列{|}n f n N ∈的任意相邻两项不等.由于1n f -,2n f -皆为奇数,则12n n f f --+为偶数.那么,有(){}12121max ,2n n n n n f f f f f ----≤+<,于是,有 {}{}{}3456max ,max ,max ,...a b f f f f >>>.显然,这无限递降正奇数数列不存在,矛盾.所以,必存在正整数k ,使得1k k f f +=,即当n k ≥时,n k f f =.设此常数为C ,由于122an n n f f f --+=,这里a 是个正整数,以及n f ,1n f -,2n f -均为奇数,可知1n f -,2n f -的最大公约数()12,n n f f --等于n f ,1n f -的最大公约数()1,n n f f -.从而,序列中任意相邻两项的最大公约数相同.那么,()(),...,C C C a b ===,即这常数为a ,b 的最大公约数.40.(2020·全国·高三竞赛)设12121,2,2,3,4,n n n a a a a a n --===+=证明:对整数5n ≥,n a ,必有一个模4余1的素因子. 【答案】证明见解析. 【解析】 【分析】不妨记11αβ==由递推式及数学归纳法得到n a 有奇素因子p ,然后对正整数进行讨论,证明也存在模4余1的素因子. 【详解】证明:记11αβ=+=-n n n a αβαβ-=-.记2n nn b αβ+=,则数列{}n b 满足122(3)n n n b b b n --=+≥ ①因121,3b b ==均为整数,故由①及数学归纳法,可知{}n b 每项均为整数.由222()22n n n n n αβαβαβαβαβ⎛⎫⎛⎫+--⎛⎫-= ⎪ ⎪ ⎪-⎝⎭⎝⎭⎝⎭, 可知222(1)(1)nn n b a n -=-≥ ②当1n >为奇数时,由于1a 为奇数,故由{}n a 的递推式及数学归纳法,可知n a 为大于1的奇数,所以n a 有奇素因子p .由②得21(mod )n b p ≡-,故112(1)(mod )p p n b p --≡-.又上式表明(),1n p b =,故由费马小定理得11(mod )p n b p -≡,从而12(1)1(mod )p p --≡.因2p >,故必须12(1)1p --=,因此1(mod 4)p ≡.另一方面,对正整数m ,n ,若|m n ,设n km =,则()(1)(2)(2)(1)n n m mk m k m m m k m k m n a αβαβααβαββαβαβ------==⋅++++--()0(212)(212)1(22)(22)1()(),2=(()(),21i im l i m l i m m l i lm im l i m l i m m l a k l a k l αβαβαβαβαβ=-----=---⎧⋅∑+=⎪⎨⎪⋅∑++=+⎩因2s ss b αβ+=为整数(对正整数s ),1αβ=-为整数,故由上式知n a 等于m a 与一个整数的乘积,从而|m n a a .因此,若n 有大于1的奇因子m ,则由前面已证得的结论知m a 有素因子1(mod 4)p ≡,而|m n a a ,故|n p a ,即n a 也有模4余1的素因子.最后,若n 没有大于1的奇因子,则n 是2的方幂.设2(3)l n l =≥, 因84082417a ==⨯有模4余1的素因子17,对于4l ≥,由8|2l 知82|l a a , 从而2l a 也有素因子17.证毕. 【点睛】关键点点睛:本题证明的关键是能够运用数论整除的相关知识以及费马小定理进行证明,不漏掉情况.41.(2019·江苏·高三竞赛)设k 、l 、c 均为正整数,证明:存在正整数a 、b 满足(,)b ac a b -=⋅,且()(),(,)a b l kb a a b a b ττττ⋅=⋅⎛⎫⎛⎫ ⎪ ⎪⎝⎭⎝⎭,其中(a ,b )表示a 、b 的最大公因数,()m τ表示正整数m 的所有不同正因子的个数. 【答案】见解析 【解析】 【详解】如果m 的标准分解式为1212n n n m p p p ααα=,那么()()()12()111n m τααα=+++.取定两个不同的素数p 、q 使得(pq ,c )=1.由于(p ,q )=1,利用裴蜀定理,存在正整数00,u v ,使得00k lp u q v c -=.由于(pq ,c )=1,那么0p v 且0q u . 由中国剩余定理,下列同余方程组:0001(mod )1(mod )1(mod )l kl u tq p v tp q u tq c ⎧+≡⎪+≡⎨⎪+≡⎩有正整数解t t =0. 令0000,l ku u t q v v t p =+=+,那么k l p u q v c -=,而且(u ,pqc )=1.因此(,)1,(,)1v pqc u v ==.现在取2211,k l l d p q n q v --==,则l k n c q v c p u +=+=. 从而(,)1n n c +=.令a =nd ,b =(n +c )d ,那么(a ,b )=d ,因此(,)b a cd c a b -==⋅.而且:()()2211()()(),k ll l p q va nd l l la n q v ab ττττττ-+-⋅=⋅=⋅⎛⎫⎪⎝⎭()22221k l l l k l l +==+.()()2211()(())(),kk l kp qub ncd k k k b n c p u a b ττττττ+--+⋅=⋅=⋅+⎛⎫⎪⎝⎭()22221kk l k k l k +==+.所以()()(,)(,)a b l ka b a b a b ττττ⋅=⋅⎛⎫⎛⎫ ⎪ ⎪⎝⎭⎝⎭.42.(2019·江西·高三竞赛)试求所有由互异正奇数构成的三元集{a ,b ,c },使其满足:2222019a b c ++=.【答案】7个,{1,13,43},{7,11,43},{13,25,35},{5,25,37},{}11,23,37,{17,19,37},{7,17,41}. 【解析】 【详解】据对称性,不妨设a <b <c ,由于奇平方数的末位数字只具有1、5、9形式,于是222,,a b c 的末位数字,要么是5、5、9的形式,要么是1、9、9的形式.又知,如果正整数n 是3的倍数,那么n 2必是9的倍数;如果n 不是3的倍数,那么n 2被3除余1.由于2019是3的倍数,但不是9的倍数,因此奇数a 、b 、c 皆不是3的倍数. 注意[2019]44c =,即奇数c ≤43,而222232019c a b c >++=, 即c 2>673,且c 不是3的倍数,故奇数c ≥29. 因此奇数{29,31,35,37,41,43}c ∈.。

acm编程例题 参考答案

acm编程例题 参考答案

acm编程例题参考答案ACM编程例题参考答案ACM(Advanced Computer Mathematics)是一种面向计算机科学与技术的竞赛形式,旨在提高参与者的编程技能和解决问题的能力。

ACM编程例题是指在ACM竞赛中出现的一系列编程题目,这些题目涵盖了各种算法和数据结构的应用。

本文将给出一些ACM编程例题的参考答案,希望能够帮助读者更好地理解和掌握这些题目的解法。

一、题目一:最大公约数题目描述:给定两个正整数a和b,求它们的最大公约数。

解题思路:最大公约数可以通过欧几里得算法来求解。

该算法的基本思想是,两个正整数的最大公约数等于其中较小的数和两数之差的最大公约数。

具体的实现可以使用递归或循环的方式。

代码示例:```c++int gcd(int a, int b) {if (b == 0) {return a;}return gcd(b, a % b);}```二、题目二:素数判断题目描述:给定一个正整数n,判断它是否为素数。

解题思路:素数是只能被1和自身整除的正整数。

判断一个数是否为素数可以使用试除法,即从2开始,依次判断n是否能被2到sqrt(n)之间的数整除。

如果存在能整除n的数,则n不是素数;否则,n是素数。

代码示例:```c++bool isPrime(int n) {if (n <= 1) {return false;}for (int i = 2; i * i <= n; i++) {if (n % i == 0) {return false;}}return true;}```三、题目三:字符串反转题目描述:给定一个字符串s,将其反转后输出。

解题思路:字符串反转可以通过将字符串的首尾字符依次交换来实现。

可以使用双指针的方式,一个指针指向字符串的首字符,另一个指针指向字符串的尾字符,然后交换两个指针所指向的字符,并向中间移动,直到两个指针相遇。

代码示例:```c++void reverseString(string& s) {int left = 0;int right = s.length() - 1;while (left < right) {swap(s[left], s[right]);left++;right--;}}```四、题目四:二分查找题目描述:给定一个有序数组和一个目标值,使用二分查找算法在数组中找到目标值的索引,如果目标值不存在,则返回-1。

ACM必做50题的解题-高精度

ACM必做50题的解题-高精度

POJ 1001 Exponentiation高精度数的计算,以前在网上看到过一个计算大数阶乘比如10000000!的算法,总体思想就是将结果用数组保存起来,然后将结果的每一位与乘数相乘,当然还有进位...有了这个算法的思想,这个题思路就可以是:先将输入的小数转换成一个整数,当然这个整数肯定能够用int类型的变量保存,比如1.2345, 通过函数 removeDot()将它转化成12345,然后利用大数阶乘的思想计算12345*12345.....*12345, 最后的就是输出了,这个要考虑的情况比较多,因为这个也WA了5次才AC(笨的要死), 情况虽多,但不难.这道题是高精度计算的,不算很难,但是很繁琐,尤其是对输入输出的要求。

被这道题搞了好久,耐心来,一点一点调试,总会成功的。

#include<iostream>#include<string>#include<math.h>using namespace std;char ans[10];char res[2][205];__int64 ps;//有几位小数点int len;//长度,R的有效长度//计算c = b * avoid Multiply(char * b,int bt,char * a,int at,char * c){int i,j;int up=0;for(i=0;i<at;++i){up=0;for(j=0;j<bt;j++){int t;if(c[i+j]==0)c[i+j]='0';t=(a[i]-48)*(b[j]-48)+c[i+j]-48+up;if(t>=10){up=t/10;t=t%10;c[i+j]=t+48;if(j==(bt-1) )c[i+j+1]=(up+48);}else{c[i+j]=t+48;up=0;}}}}int main(){string str;int n;int i,j;int s,t;int pos;while(cin>>str>>n){i=5;pos=str.find('.',0);if(pos<0)//没有小数点{ps=0;//zs=zs*n;//后面为0的总数}else//有小数点{ps=(5-pos);ps=ps*n;//小数位总数}memset(ans,0,sizeof(ans));memset(res[0],0,sizeof(res[0])); memset(res[1],0,sizeof(res[1])); t=5;s=0;while(str[s]=='0' || str[s]=='.') s++;j=0;for(i=t;i>=s;--i){if(str[i]=='.')continue;ans[j]=str[i];j++;}len=j;strcpy(res[0],ans);strcpy(res[1],ans);for(i=2;i<=n;++i){memset(res[(i+1)%2],0,sizeof(res[0]));Multiply(res[i%2],strlen(res[i%2]),ans,len,res[(i+1)%2]); }int L=strlen(res[(n+1)%2]);int d=(n+1)%2;if(ps>0){j=0;while(res[d][j]=='0')j++;if(ps>=L){printf(".");for(i=ps-1;i>=j ;--i){if(i>=L)printf("0");elseprintf("%c",res[(n+1)%2][i]);}}else{if(j>=ps){for(i=L-1;i>=ps;--i)printf("%c",res[(n+1)%2][i]);}else{for(i=L-1;i>=j ;--i){if(i==ps){printf("%c.",res[(n+1)%2][i]);}elseprintf("%c",res[(n+1)%2][i]);}}}}else{for(i=L-1;i>=0;--i)printf("%c",res[(n+1)%2][i]);}printf("\n");}return 0;}POJ 1047 Round and Round We Go题意:输入一个数,要求判该数是否为循环数.依次将该数分别于2到len(输入的数的位数)相乘,在乘的过程中,判断数发生了变化没有,如果发生了变化,则直接输出该数不是循环数,没有必要再继续乘下去,而如果是循环数,则一直需要乘下去.#include<iostream>#include<string>#include<cstdlib>#include<algorithm>using namespace std;int num[70];int ans[70];char ss[70];bool match[70];int main(){int i,j,k,len;bool flag;while(scanf("%s",ss)!=EOF){len=strlen(ss);for(i=len-1,j=0;i>=0;i--,j++)num[j]=ss[i]-'0';for(i=2;i<=len;i++){memset(ans,0,sizeof(ans));for(j=0;j<len;j++) //依次将该数与2到len之间的数相乘ans[j]=num[j]*i;for(j=0;j<len;j++) //循环处理进位if(ans[j]>=10){ans[j+1]+=ans[j]/10;ans[j]%=10;}memset(match,0,sizeof(match)); //match数组用来标记数的匹配情况flag=true;for(j=0;j<len;j++){k=0;while(k<len){if(ans[k]==num[j]&&!match[k]) //两数字相等且没有进行标记{match[k]=true;break;}k++;}if(k==len) //此时说明相乘后的结果发生了改变{flag=false;break;}}if(!flag){printf("%s is not cyclic\n",ss);break;}}if(flag)printf("%s is cyclic\n",ss);}system("pause");return 0;}POJ 1131 Octal Fractions给定一个八进制的小数题目要求你把它转换为十进制小数,转换后小数的位数是转换前八进制小数位数的3倍且不输出末尾无意义的零(即后置零). 我采用的方法是乘10然后对8取整(现在假设将p进制的小数转换为n进制,同样采用乘n取整:),每转换一位,都必须从最低位s[len-1]开始至小数的最高位(即小数点后的一位),每次计算积 g=a[j]*n+k(其中k为下一位积的进位),本位进位数 k=g/p,积在本位存入 s[j]=g%p;最后的整数k作为转换的一位存放于转换结果字符串中。

ACM中数论

ACM中数论

ACM中数论数论研究的重点是素数。

整除和因子:如果a= mb,其中a、b、m为整数,则当b≠0时,可以说b能整除a。

换句话说,a 除以b余数为0。

符号b|a常用作表示b能整除a。

当b|a时,b是a的一个因子。

素数:素数p是大于1且因子仅为± 1和±p的整数。

为简单起见,下面仅涉及非负整数。

互为素数:整数a和b互素,如果它们之间没有共同的素数因子(即它们只有一个公因子1)。

例如,8和15互素,因为1是8和15仅有的公因子(8的因子是1,2,4和8,而15的因子是1,3,5和15,可见8和15的公因子是1)。

模运算:给定任一正整数n 和任一整数a,如果用a除以n,得到的商q和余数r,则以下关系成立:a = qn + r0 ≤r < n; q = ?a/n?其中?x?表示小于或等于x的最大整数。

如果a是一个整数,而n是一个正整数,则定义a mod n为a除以n的余数。

a mod n也可记为“a (模n)”。

例如,30除以7的余数是2(30 = 4 ? 7 + 2),可记为30 mod 7 = 2。

注意:如果a mod n = 0,则n是的a一个因子。

因为在模n运算下,余数一定在0到(n- 1)之间。

因此,模n运算将所有整数映射到整数集合{0, 1. …, (n– 1)}。

这个整数集合又称为模n 的余数集合Z n。

因此余数集合Z n= {0, 1. …, (n–1)} (1) 如果(a mod n)=(b mod n),则称整数a和b模n同余,记为a≡b (mod n)。

但通常mod n不必用括号括起来,也就是说,可以记为a≡b mod n。

显然,a≡b mod n等价于b≡a mod n。

例如,73 ≡ 4 mod 23。

显然,这里mod 23一定不能省略不写。

模运算有一个性质很有用,即:如果n|(a–b)(即n能够整除(a–b)),则a≡b mod n。

反之,如果a≡b mod n,则n能够整除(a–b),即n|(a–b)。

ACM必做50题的解题-模拟

ACM必做50题的解题-模拟
}
int cmp2(const void *p, const void *q)
{
item *a = (item *)p;
item *b = (item *)q;
if(a->count > b->count)
return -1;
else if(a->count < b->count)
return 1;
{
memset(dates, 0, sizeof(dates));
memset(items, 0, sizeof(items));
max = 0;
for(i=0; i<size; i++)
{
scanf("%d", &dates[i][0]);
for(j=1; j<=dates[i][0]; j++)
POJ 1029 False coin
Slyar:又是假币判断问题,跟POJ1013类似,不过这个题用1013那个算法WA了...后来换了种枚举的算法才过...思路就是假币应该在每个不等式中都出现,最后只要看哪个硬币出现的次数和不等式出现的次数相同,如果这个硬币唯一,那它就是确认的假币。
#include <iostream>
if(find != NULL)
{
count++;
}
}
if(count >= quorum)
{
items[k].count = count;
items[k].index = i;
k++;
}
if(count == size)
break;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

poj 1061 青蛙的约会这题用的是解线性同余方程的方法,之前没接触到过,搜索资料后看到一个人的博客里面讲的很好就拷贝过来了。

内容如下:对于方程:ax≡b(mod m),a,b,m都是整数,求解x 的值,这个就是线性同余方程。

符号说明:mod表示:取模运算ax≡b(mod m)表示:(ax - b) mod m = 0,即同余gcd(a,b)表示:a和b的最大公约数求解ax≡b(mod n)的原理:对于方程ax≡b(mod n),存在ax + by = gcd(a,b),x,y是整数。

而ax≡b(mod n)的解可以由x,y来堆砌。

具体做法如下:第一个问题:求解gcd(a,b)定理一:gcd(a,b) = gcd(b,a mod b)欧几里德算法int Euclid(int a,int b){if(b == 0)return a;elsereturn Euclid(b,mod(a,b));}附:取模运算int mod(int a,int b){if(a >= 0)return a % b;elsereturn a % b + b;}第二个问题:求解ax + by = gcd(a,b)定理二:ax + by = gcd(a,b)= gcd(b,a mod b) = b * x' + (a mod b) * y'= b * x' + (a - a / b * b) * y'= a * y' + b * (x' - a / b * y')= a * x + b * y则:x = y'y = x' - a / b * y'以上内容转自/redcastle/blog/item/934b232dbc40d336349bf7e4.html由这个可以得出扩展的欧几里德算法:int exGcd(int a, int b, int &x, int &y) {if(b == 0){x = 1;y = 0;return a;}int r = exGcd(b, a % b, x, y);int t = x;x = y;y = t - a / b * y;return r;}代码:#include<iostream>#include<cstdlib>#include<cstring>#include<cmath>using namespace std;__int64 mm,nn,xx,yy,l;__int64 c,d,x,y;__int64 modd(__int64 a, __int64 b){if(a>=0)return a%b;elsereturn a%b+b;}__int64 exGcd(__int64 a, __int64 b) {if(b==0){x=1;y=0;return a;}__int64 r=exGcd(b, a%b);__int64 t=x;x=y;y=t-a/b*y;return r;}int main(){scanf("%I64d %I64d %I64d %I64d %I64d",&xx,&yy,&mm,&nn,&l);if(mm>nn) //分情况{d=exGcd(mm-nn,l);c=yy-xx;}else{d=exGcd(nn-mm,l);c=xx-yy;}if(c%d != 0){printf("Impossible\n");return 0;}l=l/d;x=modd(x*c/d,l); ///取模函数要注意printf("%I64d\n",x);system("pause");return 0;}POJ 1142 SmithNumber题意:寻找最接近而且大于给定的数字的SmithNumber什么是SmithNumber?用sum(int)表示一个int的各位的和,那一个数i如果是SmithNumber,则sum(i) =sigma( sum(Pj )),Pj表示i的第j个质因数。

例如4937775= 3*5*5*65837,4+9+3+7+7+7+5 = 42,3+5+5+(6+5+8+3+7) = 42,所以4937775是SmithNumber。

思路:要寻找大于给定数字且最接近给定数字的SmithNumber,只要将给定数字不断的加1,判断它是否是SmithNumber就行了,如果是SmithNumber就立即输出。

但是如何判断是否是SmithNumber呢?首先就是要对数字进行质因数分解。

质因数分解要保证因子都是质数。

这里先介绍一个如何判断一个数int是否是质数呢,如果对于这个数,i = 2.....sqrt(int)都不是它的约数,那int就是一个质数。

所以我们可以将i初始化为2,然后不断递增i,看i是否是int的一个约数,如果是的话那i就是int的一个质因数(因为这个数是从2开始第一个可以整除int的数,它不可能是一个可以分解的合数,否则,它的约数在它之前就整除int),然后将int除以该质因数,重置i为2,重新对int判断它是否是质数。

这样最后剩下的int一定是一个质数,从而对int进行了质因数分解然后就很简单的将数字各质因数的各位加起来,看和是否等于该数字的各位和,如果相等那它可能就是SmithNumber,为什么说只是可能呢,因为这个数可能是质数,但是质数不是SmithNumber。

#include <stdio.h>#include <math.h>int Sum( int number ){int sum = 0;while( number != 0 ){sum += number % 10;number /= 10;}return sum;}bool SmithNumber( int number ){int i = 2;int temp = number;int sumOfNumber = Sum( number );int sum = 0;while( i <= (int)sqrt( (double)number ) ){if ( number % i ==0 ){sum += Sum( i );number /= i;i = 2;}else{++i;}//以上的代码做了无谓的计算,可用下面的代码,更新于20090904 //while( number % i == 0 )//{// sum += sum(i);// number /= i;//}// ++i;}sum += Sum( number );if ( sum == sumOfNumber && number != temp ){return true;}else{return false;}}int main(){while( true ){int num;scanf("%d",&num );if ( num == 0 ){break;while( true ){if ( SmithNumber(++num)){printf("%d\n", num);break;}}}return 0;}ACM——POJ 2262(Goldbach's Conjecture)题目地址:/JudgeOnline/problem?id=2262题目思路:对于任何一个偶数 n,从 x = 1 和 y = n - 1 开始,看 x、y 是否是质数,不是则 x += 2, y += 2这题需要开很大的内存,我 RE n 次,居然是因为数组开太小了,我这题耗时不是很理想,但我的耗内存在我看到的中是最小的,所以看来 OJ 上的题只要能开内存的就尽量开。

估计我这题用栈耗时了。

#include <iostream>#include <stdio.h>#include <math.h>#include <stack>#include <memory.h>#include <string.h>using namespace std;// 判断是否为质数的函数int IsPrime ( int x ){int i;if( x < 2 )return 0;for( i = 2; i <= (int) ( sqrt( (double)x + 0.5 ) ); i++ )if( x % i == 0)return 0;return 1;int main(){// 输入数,输入数 / 2 向上延伸,输入数 / 2 向下延伸,输入数 / 2int m_Input, m_Num_Max, m_Num_Min, m_InputToTwo;// 总体输出char m_Output[ 1000000 ];memset( m_Output, 0, 1000000 );// 标识 m_Output 的 Posint m_Output_Pos = 0;// 是否找到标识bool b_Find;// 栈stack<int> m_Stack;// 临时数int m_Value_Top;// 循环输入while ( scanf( "%d", &m_Input ) && ( m_Input != 0 ) ){b_Find = true;// m_Input 肯定是一个偶数m_InputToTwo = m_Input / 2;// 置值m_Num_Max = m_Input - 1;m_Num_Min = 1;// 寻找,直至都为素数或者找不到为止while ( ( !IsPrime( m_Num_Max ) ) || ( !IsPrime( m_Num_Min ) ) ){// 否则,前进 & 后退 2 格m_Num_Max -= 2;m_Num_Min += 2;// 如果发生如下情况,则输出 "Goldbach's conjecture is wrong."if ( ( m_Num_Max < m_InputToTwo ) || ( m_Num_Min > m_InputToTwo ) ){char* m_TempChar = "Goldbach's conjecture is wrong.\n"; strcat( m_Output, m_TempChar );b_Find = false;m_Output_Pos += strlen( m_TempChar );break;}}// 如果找到了if ( b_Find ){// 将 m_Input 转换为字符串存入 m_Outputwhile ( m_Input != 0 ){m_Value_Top = m_Input % 10;m_Stack.push( m_Value_Top );m_Input /= 10;}while ( !m_Stack.empty() ){m_Value_Top = m_Stack.top();m_Output[ m_Output_Pos++ ] = m_Value_Top + 48;m_Stack.pop();}// 加入 =m_Output[ m_Output_Pos++ ] = ' ';m_Output[ m_Output_Pos++ ] = '=';m_Output[ m_Output_Pos++ ] = ' ';// 将 m_Num_Min 转换为字符串存入 m_Outputwhile ( m_Num_Min != 0 ){m_Value_Top = m_Num_Min % 10;m_Stack.push( m_Value_Top );m_Num_Min /= 10;}while ( !m_Stack.empty() ){m_Value_Top = m_Stack.top();m_Output[ m_Output_Pos++ ] = m_Value_Top + 48;m_Stack.pop();}// 加入 +m_Output[ m_Output_Pos++ ] = ' ';m_Output[ m_Output_Pos++ ] = '+';m_Output[ m_Output_Pos++ ] = ' ';// 将 m_Num_Max 转换为字符串存入 m_Outputwhile ( m_Num_Max != 0 ){m_Value_Top = m_Num_Max % 10;m_Stack.push( m_Value_Top );m_Num_Max /= 10;}while ( !m_Stack.empty() ){m_Value_Top = m_Stack.top();m_Output[ m_Output_Pos++ ] = m_Value_Top + 48;m_Stack.pop();}// 加入 \nm_Output[ m_Output_Pos++ ] = '\n';}}// 输出printf( "%s", m_Output );system( "pause" );return 0;}POJ 2407 Relatives这题从题意可以看出就是求比从1~n - 1从有几个数和n没有公共因子,通常的算法很简单就能够想到,我开始也是按通常的做法写了一个,觉得可能会TLE, 果不其然,后来上网查了一下,知道了欧拉函数,这个就是求比n小的数中与n互质(也就是没有公共因子)的算法,看来还是那些经典的算法效率比较高,比纯用暴力试探高多了...欧拉函数描述如下:利用欧拉函数和它本身不同质因数的关系,用筛法计算出某个范围内所有数的欧拉函数值。

相关文档
最新文档