A. Divisibility Problem
求a加多少能够整除b,,如果a%b==0,,直接输出0,,如果不是,,+1减去现在的即可。
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int a,b,t;
cin>>t;
while(t--)
{
cin>>a>>b;
if(a%b==0)
cout<<0<<endl;
else
{
int x=a/b;
int sum=(x+1)*b-a;
cout<<sum<<endl;
}
}
return 0;
}
B. K-th Beautiful String
长度为n的字符串,,一共有两个b,其余都是a,,按照字典序排序,,求第k小的字符串。。
就是确定两个b的位置,,观察样例发现,,第一个b在倒数第二位置的情况有1种,倒数第三有2种,,,,
第k个字符串要求我们要找到一个p,使得,,那么第一个b的位置就是n-p,,第二个p的位置为
。。。。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
cin>>t;
while(t--)
{
ll n,k;
cin>>n>>k;
ll x=sqrt(k);
while(x*(x+1)/2<k)
x++;
ll pos1=n-x;
ll y=k-(x-1)*x/2;
ll pos2=n-y+1;
for(int i=1;i<=n;++i)
{
if(i==pos1||i==pos2)
putchar('b');
else
putchar('a');
}
putchar('\n');
}
return 0;
}
C. Ternary XOR
将一个字符串分解为两个字符串的结果,,(b[i]+c[i])%3,,,使得max(b,c)最小。。
如果a为2则b=c=1;如果a为1,则b=1,c=0;如果a为0,b=c=0;
如果前面有个一了,,则后面b=0,c=a;;
#include<bits/stdc++.h>
using namespace std;
char b[50004],c[50004];
char a[50004];
int main()
{
ios::sync_with_stdio(false);
int t,n;
cin>>t;
while(t--)
{
cin>>n;
cin>>a+1;
b[1]=c[1]='1';
int flag=0;
for(int i=2;i<=strlen(a+1);i++)
{
if(!flag)
{
if(a[i]=='2')
b[i]=c[i]='1';
if(a[i]=='0')
b[i]=c[i]='0';
if(a[i]=='1')
{
b[i]='1';
c[i]='0';
flag=1;
}
}
else
{
b[i]='0';
c[i]=a[i];
}
}
for(int i=1;i<=n;i++)
cout<<b[i];
cout<<endl;
for(int i=1;i<=n;i++)
cout<<c[i];
cout<<endl;
}
return 0;
}
D. Carousel
这道题毒了半天没读懂,,英语水平还是太差啊。。。。
1.如果只要一种动物,则只需染一种色
2.如果为偶数,只需要两种色1212…1212,保证了结尾以开头也不一样
3.如果是奇数则又分为两种情况:
(1)、如果有相邻且相同的动物则可考虑最后一组相邻且相同动物一组染同一色,其他相邻染不同色,很好理解就是将最后一组合并为一个动物,然后个数又变成了偶数,染1212…12即可。
(2)、如果没有相邻且相同的动物,说明这个才是真正的奇数,则前面n-1(偶数)染1212…12最后染一个3即可。
#include<cstdio>
#include<iostream>
using namespace std;
int a[200005];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
bool flag=true;
int pos=-1;
for(int i=0;i<n;i++)
{
if(a[i]!=a[0])
flag=false;
if(a[i]==a[(i+1)%n])
pos=i;
}
if(flag)
{
puts("1");
for(int i=0;i<n-1;i++)
cout<<1<<" ";
puts("1");
}
else if(n%2==0)
{
puts("2");
for(int i=0;i<n-1;i++)
cout<<i%2+1<<" ";
puts("2");
}
else if(pos!=-1)
{
puts("2");
int k=0;
for(int i=0;i<n;i++)
{
cout<<(k+i)%2+1;
if(i==pos)
k=1;
if(i<n-1)
cout<<" ";
else
cout<<endl;
}
}
else
{
puts("3");
for(int i=0;i<n-1;i++)
cout<<i%2+1<<" ";
puts("3");
}
}
return 0;
}