1473B. String LCM
题意:1)a⋅x的含义是一个字符串a,重复x次形成的字符串。如, "abc" ⋅ 2 = "abcabc"。2)如果存在一个数x,使b⋅x=a,那么就称字符串a能被字符串b整除。3)把最短的能同时被字符串s和t整除的非空字符串称为LCM(s,t)。输入两个字符串,找出他们的LCM字符串并输出,否则输出“-1”。
题解:问题分为两部分。1)判断两个数组是否有LCM字符串。2)如果存在,如何输出LCM字符串。第一个问题,只要保证字符串在对应的位置是相同字母即可。第二个问题,通过找到字符串长的最小公倍数,循环输出,就得到答案了。
ACcode:
ll gcd(ll a, ll b)
{
return b ? gcd(b, a % b) : a;//最大公因数求法
}
ll lcm(ll a, ll b)
{
return a * b / gcd(a, b);//最小公倍数求法
}
int main()
{
int t;
cin>>t;
while (t--)
{
string a, b;
int flag = 0;
cin >> a >> b;
ll x = a.size();
ll y = b.size();
ll Lcm = lcm(x, y);
for (ll i = 0; i < Lcm; i++)
if (a[i % x] != b[i % y])
{
flag = 1;
break;
}判断两个字符串是否存在LCM字符串
if (flag == 1)
cout << "-1" << endl;
else
{
for (ll i = 0; i < Lcm; i++)
{
cout << a[i % x];//通过最小公倍数输出
}
cout << endl;
}
}
return 0;
}