Codeforces Round #956 (Div. 2) A~E

Codeforces Round #956 (Div. 2) A~E题解

A.Array Divisibility(构造)

题意:

如果一个整数数组 a 1 , a 2 , ⋯   , a n a_1,a_2,\cdots,a_n a1,a2,,an满足以下条件,那么这个数组就是美丽的整数 k k k

  • 所有 j j j上的 a j a_{j} aj之和,其中 j j j k k k的倍数, 1 ≤ j ≤ n 1\le j\le n 1jn k k k的倍数。本身是 k k k的倍数。
  • 更正式地说,如果 ∑ k ∣ j a j \sum_{k|j}a_{j} kjaj能被所有 1 ≤ j ≤ n 1\le j\le n 1jn k k k整除,那么数组 a a a k k k的限制下是美丽的。这里,符号 k ∣ j {k|j} kj表示 k k k除以 j j j,即 j j j k k k的倍数。

给定 n n n,求一个正非零整数数组,其中每个元素都小于或等于 1 0 5 10^5 105,且所有 1 ≤ k ≤ n 1\le k\le n 1kn都是美丽的。

可以证明答案总是存在的。

分析:

简单构造题,很容易发现输出 1 − n 1-n 1n满足题意。

代码:

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
int n;
 
int main(){
   
   
	int t;
	cin>>t;
	while(t--){
   
   
		cin>>n;
		for(int i=1;i<=n;++i) 
			cout<<i<<" ";
		cout<<endl;
	}
	return 0;
}

B.Corner Twist(数学)

题意:

给你两个网格,分别是 a a a b b b,行数为 n n n,列数为 m m m。网格中的所有数值都是 0 0 0 1 1 1 2 2 2

您可以多次对 a a a执行以下操作:

  • 选择网格中任意一个长宽 ≥ 2 \ge 2 2的子矩形。您可以选择整个网格作为子矩形。
  • 子矩形有四个角。取所选子矩形中任意一对斜对角,并将它们的值加上 1 1 1,对 3 3 3取模。
  • 对于未选中的一对角,在它们的值上加上 2 2 2然后对 3 3 3取模。

需要注意的是,此操作只改变被选中的子矩形的角的值。

是否可以通过任意次数(可能为零)的上述操作将网格 a a a转换为网格 b b b

分析:

观察样例发现,每次操作后,一行中的数对 3 3 3取模的值不变,一列中的数对 3 3 3取模的值不变。因此,我们只需比较两个矩阵每行的数的和对 3 3 3取模的值与每列的数的和对 3 3 3取模的值,如果都相同则有解;否则无解。

代码:

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int MAXN=500;
int a[MAXN+10][MAXN+10];
int b[MAXN+10][MAXN+10],m,n;
int sumn[14][MAXN+10];
char s[MAXN+10];

void solve(){
   
   
    int i,j;
	cin>>n>>m;
	memset(sumn,0,sizeof(sumn));
	for(i=1;i<=n;++i){
   
   
		cin>>s;
		for(j=1;j<=m;++j){
   
   
			a[i][j]=s[j-1]-'0';
			sumn[1][i]=(sumn[1][i]+a[i][j])%3;
			sumn[2][j]=(sumn[2][j]+a[i][j])%3;
		}
	}
	for(i=1;i<=n;++i){
   
   
		cin>>s;
		for(j=1;j<=m;++j){
   
   
			b[i][j]=s[j-1]-'0';
			sumn[3][
### Codeforces Round 1005 Div. 2 A-F Problem Solutions #### A. Money Change 为了处理货币转换问题,可以将所有的金额都转化为分的形式来简化计算。通过遍历输入数据并累加各个部分的金额,最后求得剩余的钱数并对100取模得到最终结果[^2]。 ```cpp #include <iostream> using namespace std; int main() { int s, xi, yi; cin >> s; int total_cents = 0; for (int i = 0; i < s; ++i) { cin >> xi >> yi; total_cents += xi * 100 + yi; } cout << (s * 100 - total_cents) % 100 << endl; } ``` #### B. Odd and Even Pairs 此题目要求找到至少一对满足条件的索引:要么是一个偶数值的位置,或者是两个奇数值位置。程序会读入测试次数`t`以及每次测试中的数组长度`n`及其元素,并尝试找出符合条件的一对索引输出;如果没有这样的组合则返回-1[^3]。 ```cpp #include <cstdio> int main() { int t, n, num; scanf("%d", &t); while (t--) { int evenIndex = 0, oddIndex1 = 0, oddIndex2 = 0; scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d", &num); if (num % 2 == 0 && !evenIndex) evenIndex = i; else if (num % 2 != 0) { if (!oddIndex1) oddIndex1 = i; else if (!oddIndex2) oddIndex2 = i; } if ((evenIndex || (oddIndex1 && oddIndex2))) break; } if (evenIndex) printf("1\n%d\n", evenIndex); else if (oddIndex1 && oddIndex2) printf("2\n%d %d\n", oddIndex1, oddIndex2); else printf("-1\n"); } return 0; } ``` 由于仅提供了前两道题的具体描述和解决方案,在这里无法继续给出完整的C至F题解答。通常情况下,每一道竞赛编程题都有其独特的挑战性和解决方法,建议查阅官方题解或社区讨论获取更多帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值