T1[NC295930]小红与奇数
题概:给定x,若x加上自己的一个因子后为奇数,输出Yes,否则输出No
主要是遍历,因子肯定是一个小于等于自己的数,测试点小的话还是可以for一下的
x=int(input())
for i in range(1,x+1):
ans=x+int(i)
if ans%2!=1:
print("No")
break;
elif ans%2==1:
print("Yes")
break;
T2[NC295915]小红与gcd三角形
题概:给定x和y,求gcd(x,y)以及判断这三个数是否可以构成三角形,可行输出Yes,反之No
首先是求最大公约数gcd,这个math库中还是可以直接操作的,其次是判断构成三角形的addtion,任意两边之和大于第三边
import math
t=int(input())
for i in range(t):
x,y=map(int,input().split())
z=math.gcd(x,y)
if (x+y>z)and(x+z>y)and(y+z>x):
print('Yes')
else:
print('No')
T3[NC296934]小红与red
题概:给定字符串长度n和字符串s,不希望s中相邻char相同,可以改成red三个字符任意一个使s达成条件。
设置一个list[r,e,d],遍历s如果s[i]==s[i-1],设置变量c,c从list中挑选出一个既不等于前面也不等于后面的char替换s[i],最后输出更改后的s即可。
n=int(input())
s=list(input())
lp=['r','e','d']
if s[n-1]==s[n-2]:
for c in lp:
if c!=s[n-2]:
s[n-2]=c
break
for i in range(1,n-1):
if s[i]==s[i-1]:
for c in lp:
if c!=s[i-1] and c!=s[i+1]:
s[i]=c
break
print(''.join(s))
T4[NC296720]小红与好数组
题概:define一个好数组(相邻元素不同且都是正整数),给定给定一个数n,使数组之和等于n,且数组是好数组,得到的所有好数组按字典序输出。
最终的结果放在result中,开始使current_array是空,sum和last为0,一个特判条件是当sum==n是把此时的array加入result中,涉及到了pop的回溯法。
def find_good_arrays(n):
result = []
def backtrack(current_array, current_sum, last_num):
if current_sum == n:
result.append(current_array.copy())
return
for num in range(1, n - current_sum + 1):
if num != last_num:
current_array.append(num)
backtrack(current_array, current_sum + num, num)
current_array.pop()
backtrack([], 0, 0)
return result
n = int(input())
good_arrays = find_good_arrays(n)
for array in good_arrays:
print(' '.join(map(str, array)))
T5[NC295920]小红与gcd和sum
题概:给定一个数组list,define权值为gcd(list)+sum(list),求这个数组权值最大的非空子序列。
emm解这道题的时候,偷偷看了一下样例发现都是子序列为相同的一个值时权值最大(但是不能确定是哪个值),所以遍历了一下list,由于要计算sum(child_list)=list.count(这个值),but这个题的ai个数最大有1e6,count需要每次都遍历一遍list,时间复杂度较大,所以定义了一个dict{},只遍历一次list将值的个数存为键值对,这样就防止贪心试错时造成的较大时间复杂度相加。
n = int(input())
s = list(map(int, input().split()))
freq = {}
for num in s:
if num in freq:
freq[num] += 1
else:
freq[num] = 1
max_count = 0
for num, count in freq.items():
p = pow(num, 2)
ans = p * count
if ans > max_count:
max_count = ans
print(max_count)
T6[NC295922]小红与天使猫猫酱
题概:给定无限长整数列格式为(题目太难打了......)
先求bi的值,bi是对应ai的因子数量,由于这个ai很大(求因子数量会爆),需要用求质因子方式来求出bi的值,but质因子的值也需要用快速幂或是pow(),当n=7时,为(2222222+1)**2也蛮大的,所以还需要拆成数学公式,
用这种方式将质因数定理得到的式子化简一下 应该会得到一个级数的式子,通过级数求和得出ans
n = int(input())
mod = 998244353
if n == 0:
print(0)
else:
# Compute sum_{i=1}^n 10^i mod (mod * 9)
sum_10_part = pow(10, n, mod * 9)
sum_10 = 10 * (sum_10_part - 1) // 9 % mod
# Compute sum_{i=1}^n 100^i mod (mod * 99)
sum_100_part = pow(100, n, mod * 99)
sum_100 = 100 * (sum_100_part - 1) // 99 % mod
# Compute the total
term1 = 4 * sum_100 % mod
term2 = 28 * sum_10 % mod
term3 = 49 * n % mod
total = (term1 + term2 + term3) % mod
# Multiply by inverse of 81
inv_81 = pow(81, mod - 2, mod)
ans = total * inv_81 % mod
print(ans)