A.Nastia and Nearly Good Numbers
题目大意:
给你两个整数 a,b,有下面定义
(1)如果一个整数整除ab,则说明他是good;
(2)如果一个整数整除a,则说明他是 nearly good。
看是否有三个不同的整数x,y,z使得x+y=z,并且三个整数中有两个为nearly good,一个为good。
思路:
直接构造即可,记的看清楚题。
因为x+y=z,所以有k1a+k2a=k3ab (k1 ! = k2)化简后可知,该式子与a没有什么关系.
一个简单容易想到的等式就是
(b-1)+(b+1) = 2*b;
所以x=(b-1) * a,y = (b+1) * a , z=2 * b * a;
注意:如果 一个 nearly good数不可能同时整除a,b,所以我们在构造的时候避免了这一点。但有一种情况,不能够避免,就是在b为1的时候,无论怎么构造,x,y,z总全都是good。
所以特判一下。
代码:
#include<stdio.h>
#define ll long long
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll a,b;
scanf("%lld%lld",&a,&b);
if(b==1) printf("NO\n");
else
{
ll x,y,z;
x=(b-1)*a;
y=(b+1)*a;
z=2*b*a;
printf("YES\n");
printf("%lld %lld %lld\n",x,y,z);
}
}
return 0;
}
B.Nastia and a Good Array
题目大意:
定义一个数组为好的标准是所有相邻的数都是互质的,即gcd(a[i-1],a[i])=1 (i=2,3,…,n)。
可以进行的操作是,从数组中选择任意两个数(两个数的位置分别为i,j)用x,y进行替换,并且有min(a[i],a[j])=min(x,y)。
操作完后的数组是好的。
输出:操作数k(0<=k<=n),
下列k行,每行是进行的操作,i,j,x,y;
思路:
没什么思路,就是要注意到k不一定是最小的(第一眼看完题习惯性觉得是用最小操作数想了一会。。。)
怎么做都可以,我是直接将每个相邻的数进行了替换,即使互质我也进行了替换,只不过这两个互质的数依旧没变。
这样的操作数是n-1,很好想。
(但我当时脑内sb了,理解错k然后意识到后,没有注意到原数组的两个数和替换两个数的最小值是相等的,终于改正过来后,发现输出数组有问题,多了一个数,纠结了40多分钟,,,,最后发现那个是下一个数组的长度,当场卒。。。。还是没在场上交,场上交的都是wa1,看榜看起来就像a了第一题就跑路了一样。。)
下面是ac代码,没有wa2,全程只有wa1(aaaaa)
#include<stdio.h>
#include<string.h>
#define ll long long
ll a[100006];
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
int n,f=0;
scanf("%d",&n);
a[0]=1;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=2;i<=n;i++)
{
ll xx=gcd(a[i-1],a[i]);
if(xx!=1)
{
f=1;
}
}
if(f==0)
{
printf("0\n");
}
else if(f==1)
{
printf("%d\n",n-1);
for(int i=1;i<=n-1;i++)
{
if(a[i]<=a[i+1])
{
ll x,y;
printf("%d %d ",i,i+1);
if(gcd(a[i],a[i+1])!=1)
{
x=a[i];
y=a[i]+1;
a[i+1]=a[i]+1;
}
else
{
x=a[i];
y=a[i+1];
}
printf("%lld %lld\n",x,y);
}
else if(a[i]>a[i+1])
{
ll x,y;
printf("%d %d ",i,i+1);
if(gcd(a[i],a[i+1])!=1)
{
while(gcd(a[i],a[i+1]!=1) || gcd(a[i],a[i-1])!=1)
{
a[i]++;
// printf("%d \n",a[i]);
if(gcd(a[i],a[i+1])==1 && gcd(a[i],a[i-1])==1)
{
break;
}
}
x=a[i];
y=a[i+1];
}
else
{
x=a[i];
y=a[i+1];
}
printf("%lld %lld\n",x,y);
}
}
/* for(int i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
printf("\n");*/
}
}
return 0;
}
下次注意(~)