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 1≤j≤n是 k k k的倍数。本身是 k k k的倍数。
- 更正式地说,如果 ∑ k ∣ j a j \sum_{k|j}a_{j} ∑k∣jaj能被所有 1 ≤ j ≤ n 1\le j\le n 1≤j≤n的 k k k整除,那么数组 a a a在 k k k的限制下是美丽的。这里,符号 k ∣ j {k|j} k∣j表示 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 1≤k≤n都是美丽的。
可以证明答案总是存在的。
分析:
简单构造题,很容易发现输出 1 − n 1-n 1−n满足题意。
代码:
#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;
}
}