总结写前:一把掉回*,大概就是A看翻译看错了然后wa了一个小时还碰巧遇到“手速场”?体验极差x.
A. Nastia and Nearly Good Numbers
题意:
给你两个整数A,B,要求x,y,z,且三个数要求满足:
①x+y=z;②(x%a0&&x%b!=0)&&(y%a0&&y%b!=0)
③z%a0&&z%b0
如果存在这样的数就输出YES和x,y,z.
否则输出NO.
思路:
既然前面两个加数必须得是a的倍数,且不能是b的倍数
其实不难想到只要(a*(b-1))%b一定不等于0
因为b和b-1互质,所以找两个相邻的即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int n,i,j,t;
cin>>t;
while(t--){
int a,b;
cin>>a>>b;
if(b==1){
scNO;
}
else {
scYES;
cout<<a*(b-1)<<" "<<a*(b+1)<<" "<<a*b*2<<endl;
}
}
return 0;
}
B. Nastia and a Good Array
题意:
一个长度为n的数组,最多执行n次改动,要使整个数组gcd(a[i-1],a[i])=1,改动是自己选择两个数,然后选择数组里的两个数进行交换,要求是选择的两个数的最小值要等于被选择的两个数的较小值。
思路:
两种解法:
①:考试时的思路,找到一个大于1e9的素数,然后间隔放,但是没想到找的复杂度这么小=。=,还去找了一个随机大素数
②:看了一个巨佬的思路,在数组里找个最小的值,然后从左往右依次修改。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e5 + 1000;
int a[maxn];
signed main()
{
int n, i, j, t, k, x, y;
cin >> t;
int m1=1408448233;
while (t--) {
cin >> n;
for (i = 1; i <= n; i++) {
cin >> a[i];
}
int d1=n%2==0?n/2:n/2+1;
if(n==1) {
cout<<0<<endl;continue;
}
cout<<d1<<endl;
for(i=2;i<=n;i+=2){
cout<<i-1<<" "<<i<<" "<<m1<<" "<<min(a[i-1],a[i])<<endl;
a[i]=min(a[i-1],a[i]);
a[i-1]=m1;
}
if(n%2!=0){
cout<<n-1<<" "<<n<<" "<<min(a[n-1],a[n])<<" "<<m1<<endl;
a[n-1]=min(a[n-1],a[n]);
a[n]=m1;
}
}
return 0;
}