AtCoder Regular Contest 148

AtCoder Regular Contest 148

A.   mod   M   ∘ \color{#804000}\texttt{A. mod M}\color{red}~\circ A. mod M 

/*
    name: mod M
    id:   AT_arc148_a
    date: 2023/01/24
*/

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
int n, a[N];

int main(){
	scanf("%d", &n);
	for(int i = 1; i <= n; ++ i){
		scanf("%d", &a[i]);
	}
	int gg = abs(a[1] - a[2]);
	for(int i = 3; i <= n; ++ i){
		gg = __gcd(gg, abs(a[i-1] - a[i]));
	}
	if(gg != 1){
		puts("1");
	} else {
		puts("2");
	}
	return 0;
}

B.   dp   ∘ \color{#008000}\texttt{B. dp}\color{red}~\circ B. dp 

/*
    name: dp
    id:   AT_arc148_b
    date: 2023/01/24
*/

#include <bits/stdc++.h>
using namespace std;

const int N = 5010;
int n, l;
char s[N], t[N], ans[N];

bool cmp(){
	for(int i = 1; i <= n; ++ i){
		if(t[i] < ans[i]){
			return true;
		}
		if(t[i] > ans[i]){
			return false;
		}
	}
	return false;
}

int main(){
	scanf("%d%s", &n, s+1);
	for(int i = 1, cnt = 0; i <= n; ++ i){
		if(!l && s[i] == 'p'){
			l = i;
			break;
		}
	}
	for(int i = l; i <= n; ++ i){
		for(int j = 1; j < l; ++ j){
			t[j] = s[j];
		}
		for(int j = l, q = i; j <= i; ++ j, -- q){
			t[j] = (s[q] == 'd' ? 'p' : 'd');
		}
		for(int j = i+1; j <= n; ++ j){
			t[j] = s[j];
		}
		if((ans[1] != 'p' && ans[1] != 'd') || cmp()){
			for(int j = 1; j <= n; ++ j){
				ans[j] = t[j];
			}
		}
	}
	for(int i = 1; i <= n; ++ i){
		putchar(ans[i]);
	}
	puts("");
	return 0;
}

C.   Lights   Out   on   Tree   ∘ \color{#00B0B0}\texttt{C. Lights Out on Tree}\color{red}~\circ C. Lights Out on Tree 

等价于两个端点不同的边的数量。

/*
    name: Lights Out on Tree
    id:   AT_arc148_c
    date: 2023/01/24
*/

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
int n, q, fa[N], val[N], col[N], k[N];
vector<int> g[N];

int main(){
	scanf("%d%d", &n, &q);
	for(int i = 2; i <= n; ++ i){
		int x;
		scanf("%d", &x);
		g[x].push_back(i);
		fa[i] = x;
	}
	g[0].push_back(1);
	fa[1] = 0;
	for(int i = 1; i <= q; ++ i){
		int m, ans = 0;
		scanf("%d", &m);
		for(int j = 1; j <= m; ++ j){
			scanf("%d", &k[j]);
			col[k[j]] = 1;
			if(col[k[j]] != col[fa[k[j]]]){
				++ ans;
			} else {
				-- ans;
			}
			ans += g[k[j]].size() - val[k[j]];
			++ val[fa[k[j]]];
		}
		printf("%d\n", ans);
		for(int j = 1; j <= m; ++ j){
			col[k[j]] = 0;
			-- val[fa[k[j]]];
		}
	}
	return 0;
}

D.   mod   M   Game   ∘ \color{#B0B000}\texttt{D. mod M Game}\color{red}~\circ D. mod M Game 

不会证,但是过了。。。

考虑每个数   m o d   m \bmod m modm 出现的次数,如果都为偶数那么显然 bob 获胜。当 m m m 为奇数的时候也确实是这么做。

m m m 为偶数时,统计每个数   m o d   m / 2 \bmod m/2 modm/2 出现的次数,并统计 m / 2 m/2 m/2 的个数。如果均为偶数则 bob 获胜,否则 alice。

/*
    name: mod M Game
    id:   AT_arc148_d
    date: 2023/01/24
*/

#include <bits/stdc++.h>
using namespace std;

const int N = 4e5 + 10;
int n, m, a[N];
map<int, int> mp;

int main(){
	scanf("%d%d", &n, &m);
	n *= 2;
	for(int i = 1; i <= n; ++ i){
		scanf("%d", &a[i]);
		++ mp[a[i]%m];
	}
	int cnt = 0;
	bool flg = true;
	for(int i = 1; i <= n; ++ i){
		if(m & 1){
			if(mp[a[i]%m] & 1){
				flg = false;
				break;
			}
		} else {
			if((mp[a[i]%m] + mp[(a[i]+m/2)%m]) & 1){
				flg = false;
				break;
			} else if(mp[a[i]%m] & 1){
				++ cnt;
				mp[a[i]%m] = mp[(a[i]+m/2)%m] = 0;
			}
		}
	}
	puts(flg && !(cnt & 1) ? "Bob" : "Alice");
	return 0;
}

E. ≥ K   △ \color{#FF8000}\texttt{E.} \geq\texttt{K}\color{red}~\vartriangle E.K 

不会。

/*
    name: ≥ K
    id:   AT_arc148_e
    date: 2023/01/24
*/

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 2e5 + 10;
const ll P = 998244353;
int n, k, a[N], s = 1;
ll fac[N], ans = 1;
map<int, int> m;

ll qp(ll a, ll b){
	ll ans = 1;
	while(b){
		if(b & 1){
			ans = ans * a % P;
		}
		a = a * a % P;
		b >>= 1;
	}
	return ans;
}

int main(){
	scanf("%d%d", &n, &k);
	for(int i = 1; i <= n; ++ i){
		scanf("%d", &a[i]);
		++ m[a[i]];
	}
	fac[0] = 1;
	for(int i = 1; i <= n; ++ i){
		fac[i] = fac[i-1] * i % P;
	}
	sort(a + 1, a + n + 1);
	for(int i = 1, j = n; i <= j;){
		ans = ans * s % P;
		if(a[i] + a[j] < k){
			-- s;
			++ i;
		} else {
			++ s;
			-- j;
		}
	}
	for(auto& [qwqbro, v] : m){
		ans = ans * qp(fac[v], P-2) % P;
	}
	printf("%lld\n", ans);
	return 0;
}

F.   998244353 → 1000000007   − \color{#FF0000}\texttt{F. } \color{#808080}\texttt{998244353}\to\texttt{1000000007}\color{grey}~- F. 9982443531000000007 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值