1.1521A
题解备份
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
// 题目大意
// 有t组测试数据,每组包含a和b
// 定义 好数可被a*b整除 一般数仅可被a整除
// 问对于ab能否找到一组xyz使得 有俩数一般好 一个数好 同时x+y=z
// 1<=a,b<=1e6 1<=xyz<=1e18
// 不要想ab是否会相等 ab是两个数
/*--------------解题思路--------------------*/
// 可以发现若有解 xyz必然|a
// 所以对于有解的情况 1+b=b+1的组合就是答案 再将每个数都*a
// a+a*b=a*(b+1)就是答案
// 同时我们发现 b必须>1因为 若b=1则 会出现相同的数a+a=a*2
// 1+(b-1)=b的形式 使得b=2无法得出正解 应变形为1+b=b+1
typedef long long ll;
ll T,a,b;
int main(){
scanf("%lld", &T);
while (T--){
scanf ("%lld%lld",&a,&b);
if (b==1){
puts("NO");
continue;
}
puts("YES");
printf ("%lld %lld %lld\n",a,a*b,a*(b+1));
}
}
2.1326A
题解备份
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
// 1326A
// 题目大意
// 有t组测试数据,每组包含一个n
// 要求找出一个s满足以下条件 1.s>0 2.s是n位数
// 3.s的数位没有0 4.不能被任意一个数位整除
/*-------------------解题思路-------------*/
// 构造出来的s 末尾肯定不能是2 5结尾
// 同时 若里面有3 9 肯定不能让数位和|3
// 由此找到突破点 我构造一个3结尾 其他数字尽量不少出现 同时数位和不能|3的数就好了
// 于是想到构造2929循环3结尾 若构造过程中数位和为3了 该位变成7 继续循环的方法
// 后来看题解发现脱裤子放屁了 23333...结构就好了
int T,n;
void bian(int t,string &ans,int &sum){
sum+=t;
ans+=('0'+t);
}
int main(){
scanf ("%d",&T);
while (T--){
scanf("%d", &n);
if (n==1){
puts("-1");
continue;
}
else if (n==2){
puts("29");
continue;
}
string ans="29";
int n_sum=11;//当前数位和
for (int i=0;i<n-3;i++){
if (i%2==0){
if ((n_sum+2)%3==0){
bian(7,ans,n_sum);
}
else bian(2,ans,n_sum);
}
else {
if ((n_sum+9)%3==0){
bian(7,ans,n_sum);
}
else bian(9,ans,n_sum);
}
}
ans+='3';//结尾为3
cout<<ans<<'\n';
}
return 0;
}
/*23..循环做法
int main(){
scanf ("%d",&T);
while (T--){
scanf("%d", &n);
if (n==1){
puts("-1");
continue;
}
printf ("2");
for (int i=0;i<n-1;i++){
printf ("3");
}
puts("");
}
return 0;
}*/
3.1520C
题解备份
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
// 1520C
// 题目大意
// t组测试数据 每组一个n
// 要求构造出一个矩阵 矩阵内元素是1~n*n不重不漏
// 同时要求 相邻格子内的元素不能是连续的 即使差的绝对值要>=2
/*-------------------解题思路-----------------*/
// 当时想到相邻格子差的绝对值要大于2
// 便想到利用这性质 先一行一行填奇数 奇数填完再填偶数
// 1 3 5 1 3 5 7
// 7 9 2 9 10 11 13
// 4 6 8 2 4 6 8
// 10 12 14 16
// 同时 对于n为奇数的情况 特判一下 在中心直接填上n*n
// 使得填奇数的次数与填偶数的次数相同
// 简单验证了一下似乎可行 只有n=2是无解的 然后就ac了
// 但官方的题解我看不懂 放在这里 感兴趣的可以看一下
// https://codeforces.com/blog/entry/90342
int T,n;
int main(){
scanf ("%d",&T);
while (T--){
scanf("%d", &n);
if (n==2) {puts("-1");continue;}
int a[110][110]={0};
int r,c;
r=c=0;
if (n%2) a[n/2][n/2]=n*n;//n为奇数 特判一下 把中心给填上
for (int i=1;i<=n*n;i+=2) {//填奇数
a[r][c++]=i;
if (c==n){
r++,c=0;
}
}
for (int i=2;i<=n*n;i+=2) {//填偶数
a[r][c++]=i;
if (c==n){
r++,c=0;
}
}
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
printf ("%d ",a[i][j]);
}
puts("");
}
}
return 0;
}
4.1476A
题解备份
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
// 1476A
// 题目大意
// T组测试数据 每组给定一个n与k
// 要求构造出数组 使得数组和能|k
// 问这样一个数组在满足条件的情况下 组内元素最大值最小是多少
// /*------------------解题思路----------------*/
// 设数组和为x*k 找到一个x 使得x*k最小 这样数组内的最大值就能最小了
// 数组内最大值为(x*k+n-1)/n
// 我使用二分找到x
// 题解方法x=(n+k-1)/k
// 解释:数组的和的最小值为n 所以采用上取整就能得到满足(x*k|k)的最小x
typedef long long ll;
int T;
ll n,k;
int main(){
scanf("%d", &T);
while (T--){
scanf("%lld%lld", &n, &k);
ll l=1,r=1e9;
while (l<r){
int mid=l+r>>1;
if (k*mid/n>=1) r=mid;
else l=mid+1;
}
printf ("%lld\n",(l*k+n-1)/n);
}
return 0;
}
/*题解方法
int main(){
scanf("%d", &T);
while (T--){
scanf("%lld%lld", &n, &k);
ll x=(n+k-1)/k;
printf ("%lld\n",(x*k+n-1)/n);
}
return 0;
}*/
5.1333A
题解备份
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
//1333A
//题目大意
//T组读入 每组一个n与m 2<=n,m<=100
//要求构造一个矩阵 只有黑白二色
// 设b=相邻格子有白色的黑格子的数量 w反之
// 要求构造的矩阵要满足b=w+1
// 最后输出 B代表黑 W代表白
/*--------------解题思路----------------*/
// 这题没做出来😓
// 题解思路是将格子全涂黑 第一行第一个格子为白 这样b=2 w=1
// 同时 2<=n,m<=100 完全满足要求
// 题解提到 为了降低难度 没有将数据范围设成1<=n,m<=100
// 个人认为只要对于 n==1||m==1的情况特判一下就好了
// n*m<=2的无解 其余情况 全涂黑第二个格子涂白就行了
const int MXA=-0x3f3f3f3f;
const int MNI=0x3f3f3f3f;
typedef long long ll;
int T,n,m;
char ans[110][110];
void init(){
for (int i=0;i<110;i++){
for (int j=0;j<110;j++){
ans[i][j]='B';
}
}
ans[0][0]='W';
}
int main(){
scanf ("%d",&T);
init();
while (T--){
scanf("%d%d", &n, &m);
for (int i=0;i<n;i++){
for (int j=0;j<m;j++){
printf ("%c",ans[i][j]);
}
puts("");
}
}
return 0;
}
6.688B
题解备份
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
//688B
//给你一个大整数n 问第n个偶数长度回文数是多大
/*------------------解题思路--------------*/
//观察样例 可知第一个偶数回文数是11 第二个是22 第十个是1001
//得到规律 字符串读入n输出 再倒着输出就是答案了
typedef long long ll;
int main(){
string n;
cin>>n;
cout<<n;
reverse(n.begin(),n.end());
cout<<n;
return 0;
}
7.766B
题解备份
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
//766B
//题目大意
//给你n个数 3<=n<=1e5 问能不能选三个数整个三角形出来
//按照情况输出yes/no
/*---------------------解题思路---------------*/
//排个序 三条边的绝对值差值越小越有可能组成
//所以遍历一遍就有答案了
typedef long long ll;
const int N = 1e5+10;
int n,a[N];
bool check(int a,int b,int c){
if (a+b>c&&a+c>b&&b+c>a&&
a-b<c&&a-c<b&&b-c<a) return 1;
return 0;
}
int main(){
scanf ("%d",&n);
for (int i = 1; i <= n; i ++ ) scanf ("%d",&a[i]);
sort(a+1,a+1+n);
for (int i=2;i<=n;i++){
if (check(a[i-1],a[i],a[i+1])){
puts("YES");
return 0;
}
}
puts("NO");
return 0;
}
8.1490B
题解备份
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
//1490B
//题目大意
// t组读入 每组给一个n 和n个数 保证n|3
// 如果可以操控任意一个数+1 请问最少要操作几次使得ai%3的个数相同
// 即%3=0 %3=1 %3=2的数字个数相同
/*------------解题思路------------------*/
// 这题就像推硬币机一样 只有高于一定高度了才能把硬币推到下一层
// 记录各余数的个数 开始循环
// 找到第一个 个数大于n/3的 把超出的部分都++推到下一层
// 知道所有余数个数都等于n/3
//ps:本来的思路是找到大于n/3最大的在推到下一层
//后来发现不如找到就推 可拓展性和时间复杂度都比较好
typedef long long ll;
const int N = 1e5+10;
int T,n,a[N];
bool check(int c[]){
if (c[0]==c[1]&&c[1]==c[2]) return 1;
return 0;
}
int main(){
scanf ("%d",&T);
while (T--){
scanf("%d", &n);
int c[3]={0};
for (int i = 1; i <= n; i ++ ) {
scanf ("%d",&a[i]);
c[a[i]%3]++;
}
//printf ("c0=%d c1=%d c2=%d\n",c[0],c[1],c[2]);
int ans=0;
while(!check(c)){
int t=0;//t存要推的余数
for (int i=0;i<3;i++){
if (c[i]>n/3) {
t=i;
break;
}
}
int u=c[t]-n/3;
c[t]-=u;
c[(t+1)%3]+=u;
ans+=u;
}
printf ("%d\n",ans);
}
return 0;
}
9.
10.118B
题解备份
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
//118B
//题目大意
//对于输入的n输出对应的菱形
/*--------------------解题思路-------------------*/
//纯纯语法题 写了两个函数 一个负责输出空格 一个负责输出数字
//对于空格 设每行中间的数字为x 则空格为2*(n-x)个
//唯一要注意就是每行最后一个数字结尾不能有空格
typedef long long ll;
const int N = 1e5+10;
void put_k(int n){
for (int i=0;i<n;i++) printf (" ");
}
void put_int(int n){
for (int i=0;i<n;i++) printf ("%d ",i);
for (int i=n;i>0;i--) printf ("%d ",i);
puts("0");
}
int main(){
int n;
scanf("%d", &n);
for (int i=0;i<n;i++) {
put_k(n-i);
put_int(i);
}
for (int i=n;i>=0;i--){
put_k(n-i);
put_int(i);
}
return 0;
}
// 0
// 0 1 0
// 0 1 2 1 0
// 0 1 0
// 0
// 0
// 0 1 0
// 0 1 2 1 0
// 0 1 0
// 0
// 0
// 0 1 0
// 0 1 2 1 0
// 0 1 2 3 2 1 0
// 0 1 2 1 0
// 0 1 0
// 0
// 0
// 0 1 0
// 0 1 2 1 0
// 0 1 2 3 2 1 0
// 0 1 2 1 0
// 0 1 0
// 0