Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)
A. Doggo Recoloring
题意:给出字符串只有小写字母,问能不能把所有的字符变成相同的,能变的字母只有在改字符串中有两个及两个以上。
思路:直接判断,字符中有没有两个以上的字母一样,一样 就Yes,这里要注意n==1的情况。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100010;
int a[30];
int main()
{
int n,flag=0;
string s;
memset(a,0,sizeof(a));
scanf("%d",&n);
cin>>s;
if(n==1) flag=1;//忘记考虑n==1
for(int i=0;i<n;i++)
{
a[s[i]-'a'+0]++;
if(a[s[i]-'a'+0]>=2)
{flag=1;break;}
}
if(flag) printf("Yes\n");
else printf("No\n");
return 0;
}
B. Weakened Common Divisor
题意:求给的[(a1,b1),(a2,b2)……(ai,bi)…..(an,bn)]的gcd>1,只要大于1。
思路:一开始用的是素数打表,直接可能的答案,但是一直没过,后来问了大佬,直接不用素数,存下a[0],b[0]的因子,一起作为答案集合寻找是否存在答案。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=150000+10;
ll GCD(ll a,ll b)
{
return b==0?a:GCD(b,a%b);
}
bool judge(ll a,ll b,ll c,ll d)
{
ll q=GCD(a,c);ll w=GCD(a,d);
ll e=GCD(b,c);ll r=GCD(b,d);
if(q==1&&w==1&&e==1&&r==1) return 1;
return 0;
}
ll a[maxn],b[maxn],g[maxn];
int main()
{
int n,flag=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%I64d%I64d",&a[i],&b[i]);
if(a[i]&1&&b[i]&1) flag=1;//表示没有2的公约数
}
if(!flag) printf("2\n");
else if(n==1) printf("%I64d\n",a[0]);
else
{
//直接存
int cnt=0;
int e=sqrt(a[0]);
for(ll i=2;i<=e;i++)
{
if(a[0]%i==0) g[cnt++]=a[0]/i,g[cnt++]=i;
}g[cnt++]=a[0];
e=sqrt(b[0]);
for(ll i=2;i<=e;i++)
{
if(b[0]%i==0) g[cnt++]=b[0]/i,g[cnt++]=i;
}g[cnt++]=b[0];
sort(g,g+cnt);
int ff=0,f1=0;//ff判断之前有木有输出,f1判断是不可能有结局的
for(int i=0;i<cnt;i++)
{
ll ans=g[i];flag=0;
for(int j=1;j<n;j++)
{
if(a[j]%ans!=0&&b[j]%ans!=0)
{
flag=1;
break;
}
if(judge(a[j],b[j],a[j-1],b[j-1]))
{
f1=1;
break;
}
}
if(!flag)
{
printf("%I64d\n",ans);
ff=1;
break;
}
if(f1) break;
}
if(!ff||f1) printf("-1\n");
}
return 0;
}