本来想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")
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')
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]))
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)
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);
}
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);
}