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]小红与天使猫猫酱

题概:给定无限长整数列格式为(题目太难打了......)alt

先求bi的值,bi是对应ai的因子数量,由于这个ai很大(求因子数量会爆),需要用求质因子方式来求出bi的值,but质因子的值也需要用快速幂或是pow(),当n=7时,为(2222222+1)**2也蛮大的,所以还需要拆成数学公式,

alt

用这种方式将质因数定理得到的式子化简一下 应该会得到一个级数的式子,通过级数求和得出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)