本来想30min速通的,结果F题取模一开始取成1e9+7,后面又爆ll,没能速通成功。

A.小红与奇数

暴力遍历所有因子,检查是否有一组满足条件。

x = int(input())
f = 0
for i in range(1, x+1):
    if x % i == 0 and (x + i) % 2 == 1:
        f = 1
print("Yes" if f else "No")

A题代码

B.小红与gcd三角形

算出三条边的值,检查最小的两条边之和是否大于第三边即可。

from math import gcd
t = int(input())
for _ in range(t):
    x, y = map(int, input().split())
    a = sorted([x, y, gcd(x, y)])
    print('Yes' if a[0] + a[1] > a[2] else 'No')

B题代码

C.小红与red

遍历一遍字符串,遇到相邻相同的,为了使操作次数最小,我们需要将其改为和两侧均不同的字符。

n = int(input())
s = list(input())
s.append('@')
def other(a, b):
    t = ['r', 'e', 'd']
    for ch in t:
        if ch != a and ch != b:
            return ch
for i in range(1, n):
    if s[i] == s[i-1]:
        s[i] = other(s[i-1], s[i+1])
print(''.join(s[:n]))

C题代码

D.小红与好数组

dfs搜索所有的数组

n = int(input())

res = []

def dfs(left, now):
    if left == 0:
        res.append(now[:])
        return         
    for i in range(1, left+1):
        if not now or i != now[-1]:
            dfs(left - i, now + [i])
dfs(n, [])
res.sort()
for j in res:
    print(*j)

D题代码

E.小红与gcd和sum

我们知道 = (, 为正整数)。

因此想到可以枚举 , 统计数组中为 的倍数的所有数之和,在乘上 。(前提是数组中有值为gcd的数)

所有的结果取最大即可。

注意由于 ,时间复杂度约为

void solve(){
    ll n = read();
    vector<ll> a(n+1);
    map<ll, ll> memo;
    for(ll i=1;i<=n;i++){
        a[i] = read();
        memo[a[i]]++;
    }
    ll ans = 0;
    for(ll i=1;i<=maxn;i++){
        if(!memo[i]) continue;
        ll val = 0;
        for(ll j=i;j<=maxn;j+=i){
            val += memo[j] * j;
        }
        ans = max(val * i, ans);
    }
    print(ans);
}

E题代码

F.小红与天使猫猫酱

打表可得 个因子。

(证明的话例如, , , 的因子可以由 的因子相乘得到,但是 要去重。数学归纳可证上述结论)

于是 = =

求和得到

注意会爆 ,要写成(警钟敲烂)

void solve(){
    ll n = read();
    ll tt1 = (400%MOD * ksm(99 * 81%MOD, MOD-2)%MOD)%MOD*(ksm(100, n)%MOD + MOD- 1 )%MOD; 
    ll tt2 = (280%MOD * ksm(9 * 81%MOD, MOD-2)%MOD)%MOD * (ksm(10, n)%MOD - 1 + MOD)%MOD;
    ll tt3 = (49 * ksm(81, MOD-2)%MOD)%MOD*(n%MOD)%MOD;
    print(((tt1%MOD + tt2%MOD)%MOD + tt3)%MOD);
}

F题代码