A. Divisibility Problem
题目
题意:a每次加1,问a加多少次就可以整除以b
思路:若a可以整除以b,输出0;否则输出(a/b+1)*b-a;
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
int q;
cin>>q;
while(q--)
{
ll a,b;
cin>>a>>b;
if(a%b==0)
cout<<'0'<<endl;
else
{
ll r=a/b;
r=(r+1)*b-a;
cout<<r<<endl;
}
}
return 0;
}
B. K-th Beautiful String
题目
题意:n-2个a,2个b,将字符串进行全排列,求第k个字符串
思路:只需要找出两个b的位置。
第一个b的位置:第一个有一个,第二个有两个,第三个有三个、、、计算累加到大于k的时候是的几个,可以算出第一个b的位置;
第二个b的位置:多出来第几个就是,倒数第几个
#include <iostream>
using namespace std;
typedef long long ll;
const int M=2e5+5;
ll a[100000];
int main()
{
a[0]=0;
int q;
cin>>q;
while(q--)
{
int n;
int k,i;
cin>>n>>k;
int l,r;
for(i=1; a[i-1]<=2e9; i++)
{
a[i]=a[i-1]+i;
if(a[i]>=k)
{
l=n-i;
r=n-(k-a[i-1])+1;
break;
}
}
for(i=1;i<=n;i++)
{
if(i==l||i==r)
cout<<'b';
else cout<<'a';
}
cout<<endl;
}
return 0;
}
C. Ternary XOR
题目
题意:两个数组每一位相加后对三取余,得到的最后的数组为给出的数组,求最小的这样的两个数组。
思路:根据给出的数组求结果
若为0都为0,若为2都为1
若为1,则其中一个数组为1后以后不管遇到什么都为0,另一数组遇谁为谁,可保证数组最小。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int M=5e4+5;
int main()
{
int q;
cin>>q;
while(q--)
{
int n,i;
cin>>n;
int a[M],b[M],d[M];
bool flag=true;
for(i=0; i<n; i++)
{
char ch;
cin>>ch;
a[i]=ch-'0';
if(flag)
{
if(a[i]==1)
{
b[i]=1;
d[i]=0;
flag=false;
}
else if(a[i]==2)
{
b[i]=d[i]=1;
}
else if(a[i]==0)
{
b[i]=d[i]=0;
}
}
else
{
if(a[i]==1)
{
b[i]=0;
d[i]=1;
}
else if(a[i]==2)
{
b[i]=0;
d[i]=2;
}
else if(a[i]==0)
b[i]=d[i]=0;
}
}
for(i=0; i<n; i++)
cout<<b[i];
cout<<endl;
for(i=0; i<n; i++)
cout<<d[i];
cout<<endl;
}
return 0;
}