A. Nastia and Nearly Good Numbers
题意:如果一个整数可以被AXB整除,那么这个数是好的。如果他只可以被A整除,那这个数是几乎好的。给A和B,寻找三个不同的数x、y、z,x+y=z,使z是好的,x、y是几乎好的。如果能找到输出YES和满足条件的一组x、y、z,否则输出NO
题解:如果B等于1,那么能被A整除的数也一定能被B整除,不符合题意。其他情况可构造x=a, y=a(2b-1), z=2ab
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t;
ll a,b;
cin>>t;
while(t--){
cin>>a>>b;
if(b==1){
cout<<"NO"<<endl;
}else{
cout<<"YES"<<endl;
cout<<a<<" "<<a*(2*b-1)<<" "<<a*b*2<<endl;
}
}
return 0;
}
B. Nastia and a Good Array
题意:如果一个数组符合gcd(ai−1,ai)=1 , (2≤i≤n) 就称这个数组是好的。你可以执行这样的操作:选择两个不同的索引 i , j (1<i,j<=n,i≠j)和两个整数x, y (1 <x, y<2⋅109),使min (ai, aj) = min (x, y)。然后将ai改为x,aj改为y。
题解:相邻的两个数互质,最大公约数为1。我们找到数组最小值的位置,分别向他的左侧和右侧操作,使他向两边递增。每次都选取最小的数作为ai和x,y值则依次递增
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 100010
int a[MAXN];
int main(){
int t;
cin>>t;
while(t--){
int n,flag=0;
ll minn=1e18;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]<minn){
minn=a[i];
flag=i;
}
}
ll t=a[flag];
cout<<n-1<<endl;
for(int i=flag-1;i>=1;i--){
t+=1;
cout<<flag<<" "<<i<<" "<<a[flag]<<" "<<t<<endl;
// a[i]=t;
}
t=a[flag];
for(int i=flag+1;i<=n;i++){
t+=1;
cout<<flag<<" "<<i<<" "<<a[flag]<<" "<<t<<endl;
// a[i]=t;
}
/* for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;*/
}
return 0;
}
C. Nastia and a Hidden Permutation
待补