备战2024年蓝桥杯 -- 每日一题
Python大学A组
试题一:最大公约数
【题目描述】
【输入格式】
第一行包含整数 T,表示共有 T 组测试数据。
每组数据占一行,包含两个整数 a,m。
【输出格式】
每组数据输出一行结果,一个整数,表示满足条件的非负整数 x 的个数。
【数据范围】
前三个测试点满足,1≤T≤10
所有测试点满足,1≤T≤50,1≤a<m≤1010
【输入样例】
3
4 9
5 10
42 9999999967
【输出样例】
6
1
9999999966
【解题思路】
就是求m/gcd(m,d)的欧拉函数。
【Python程序代码】
python
from math import *
T = int(input())
for _ in range(T):
a,m = map(int,input().split())
d = gcd(a,m)
a//=d; m//=d
res = m
i = 2
while i*i<=m:
if m%i==0:
res *=(i-1)/i
while m%i==0:m//=i
i+=1
if m>1:res*=(m-1)/m
print(int(res))
试题二:欧拉函数
【题目描述】
【输入格式】
第一行包含整数 n。
接下来 n 行,每行包含一个正整数 ai。
【输出格式】
输出共 n 行,每行输出一个正整数 ai 的欧拉函数。
【数据范围】
1≤n≤100,
1≤ai≤2×109
【输入样例】
python
3
3
6
8
【输出样例】
python
2
2
4
【解题思路】
模板题
【Python程序代码】
python
T = int(input())
for _ in range(T):
m = int(input())
res = m
i = 2
while i*i<=m:
if m%i==0:
res *=(i-1)/i
while m%i==0:m//=i
i+=1
if m>1:res*=(m-1)/m
print(int(res))
试题三:筛法求欧拉函数
【题目描述】
给定一个正整数 n,求 1∼n中每个数的欧拉函数之和。
【输入格式】
共一行,包含一个整数 n。
【输出格式】
共一行,包含一个整数,表示 1∼n中每个数的欧拉函数之和。
【数据范围】
1≤n≤106
【输入样例】
python
6
【输出样例】
python
12
【解题思路】
模板题
【Python程序代码】
python
n = int(input())
primes,st = [],[0]*(n+10)
res = [0]*(n+10)
def work(n):
res[1]=1
for i in range(2,n+1):
if st[i]==0:
primes.append(i)
res[i]=i-1
j = 0
while primes[j]*i<=n:
k = primes[j]*i
st[k]=1
if i%primes[j]==0:
res[i*primes[j]] = res[i]*primes[j]
j += 1
break
res[i*primes[j]] = res[i]*(primes[j]-1)
j += 1
ans = 0
for i in range(1,n+1):
ans += res[i]
return ans
print(work(n))
试题四:互质数的个数
【题目描述】
给定 a,b,求 1≤x<ab 中有多少个 x 与 a^b 互质。
由于答案可能很大,你只需要输出答案对 998244353 取模的结果。
【输入格式】
输入一行包含两个整数分别表示 a,b,用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案。
【数据范围】
【输入样例】
python
2 5
【输出样例】
python
16
【解题思路】
就是求a^b的欧拉函数值
【Python程序代码】
python
a,b = map(int,input().split())
p = 998244353
def work(t,k):
return t*pow(k,p-2,p)%p
res = pow(a,b,p)
i,t=2,a
while i*i <= t:
if t%i==0:res=res*work(i-1,i)%p
while t%i==0:t//=i
i += 1
if t!=1:res = res*work(t-1,t)%p
if a==1:res=0
if a==p and b==1:res = p-1
print(res)
试题五:可见的点
【题目描述】
在一个平面直角坐标系的第一象限内,如果一个点 (x,y)与原点 (0,0) 的连线中没有通过其他任何点,则称该点在原点处是可见的。
例如,点 (4,2)就是不可见的,因为它与原点的连线会通过点 (2,1)。
部分可见点与原点的连线如下图所示:
编写一个程序,计算给定整数 N 的情况下,满足 0≤x,y≤N0≤ 的可见点 (x,y)的数量(可见点不包括原点)。
【输入格式】
第一行包含整数 C,表示共有 C 组测试数据。
每组测试数据占一行,包含一个整数 N。
【输出格式】
每组测试数据的输出占据一行。
应包括:测试数据的编号(从 1 开始),该组测试数据对应的 N 以及可见点的数量。
同行数据之间用空格隔开。
【数据范围】
1≤N,C≤1000
【输入样例】
python
4
2
4
5
231
【输出样例】
python
1 2 5
2 4 13
3 5 21
4 231 32549
【解题思路】
筛法求欧拉函数,答案就是res[i]*2+1,仔细思考一下。
【Python程序代码】
python
c = int(input())
primes,st = [],[0]*(1010)
res = [0]*(1010)
def work(n=1000):
res[1]=1
for i in range(2,n+1):
if not st[i]:
primes.append(i)
res[i]=i-1
j = 0
while primes[j]*i<=n:
st[primes[j]*i]=1
if i%primes[j]==0:
res[primes[j]*i]=res[i]*primes[j]
j+=1
break
res[primes[j]*i]=res[i]*(primes[j]-1)
j +=1
work(1000)
for i in range(1,1001):res[i]+=res[i-1]
for i in range(c):
x = int(input())
print(i+1,x,res[x]*2+1)