总结写前:一把掉回解放前,大概就是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; }
解法②:
#include<bist/stdc++.h> using namespace std; #define int long long const int maxn = 2e5 + 1000; int a[maxn]; int st[maxn][4]; signed main() { int t; cin >> t; while(t--){ int n,i,j,min1=inf,ans1=0; cin >> n; for( i = 1; i <= n; i++){ cin >> a[i]; if(a[i]<min1){ min1=a[i]; ans1=i; } } int cnt=0; for(i=1;i<=n;i++){ if(i==ans1) continue; st[cnt][0]=i,st[cnt][1]=ans1,st[cnt][2]=min1+abs(i-ans1),st[cnt][3]=min1; cnt++; } cout<<cnt<<endl; for(i=0;i<cnt;i++){ for(j=0;j<4;j++) cout<<st[i][j]<<" "; cout<<endl; } } }