B. GCD Length
一开始看到这个题啥思路也没有
然后看巨佬的代码,想法实在是太聪明了,就构造10的倍数
#include<bits/stdc++.h>
using namespace std;
int t, a, b, c;
const int maxn = 1e5 + 9;
int qpow(int a, int n)
{
int ans = 1;
while(n)
{
if(n & 1) ans = ans * a;
a = a * a;
n >>= 1;
}
return ans;
}
int main()
{
cin >> t;
while(t--)
{
cin >> a >> b >> c;--a,--b,--c;
printf("%d %d\n",qpow(10,a), qpow(10,b)+qpow(10,c));
}
return 0;
}
C. Yet Another Card Deck
抽到的卡片,它之后的不动,然后把它放到第一个,小于它的 + 1。
因为每次询问只与每个数字第一次出现的位置有关,暴力即可
#include<bits/stdc++.h>
using namespace std;
const int maxn = 59;
int n, q;
int f[maxn], x;
int main()
{
cin >> n >> q;
for(int i = 1; i <= n; ++i)
{
scanf("%d", &x);
if(!f[x]) f[x] = i;
}
for(int i = 1; i <= q; ++i)
{
scanf("%d", &x);
cout << f[x] << " ";
for(int i = 1; i <= 50; ++i)
if(f[i] && f[i] < f[x]) ++f[i];
f[x] = 1;
}
return 0;
}
D. Min Cost String
第一组数据提示找最小循环节
#include<bits/stdc++.h>
using namespace std;
const int maxn = 59;
int n, k;
int len;
char s[114514];
int main()
{
cin >> n >> k;
for(int i = 0; i < k; ++i)
{
s[len++] = 'a' + i;
for(int j = i + 1; j < k; ++j)
{
s[len++] = 'a' + i;
s[len++] = 'a' + j;
}
}
for(int i = 1; i <= n; ++i)
cout << s[i % len];cout << endl;
return 0;
}