A. Little C Loves 3 I
水题,分两种情况(1,1,n-2),(1,2,n-3)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
if((n-2)%3==0)
cout<<1<<" "<<2<<" "<<n-3<<endl;
else
cout<<1<<" "<<1<<" "<<n-2<<endl;
return 0;
}
B. Cover Points
以最大的|x+y|为基准求x+y=b与坐标轴的交点
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int maxn=-1;
for(int i=0;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
maxn=max(maxn,x+y);
}
int pos=maxn;
cout<<pos<<endl;
}
C. Enlarge GCD
有价值的一道题
题意:是去掉数列中的一些数,是整个数列的gcd增大(增大即可)
做法:首先求出整个数列的gcd(记为g)
此时数列可以表示为:k1*g,k2*g,k3*g,k4*g...(k1,k2,k3,k4..互质)
记录每个质因子在这个数列中出现的次数
找出出现次数最多的质因子的次数即可
再用个数减去次数
#include<bits/stdc++.h>
using namespace std;
int cnt;
#define maxn 15010
int a[15000001];
int p[15000001];
bool isprime[maxn];
int prime[maxn];
void init()
{
cnt=0;
memset(isprime,true,sizeof isprime);
for(int i=2;i<=maxn;i++)
{
if(isprime[i])
{
prime[cnt++]=i;
for(int j=2;i*j<=maxn;j++)
isprime[i*j]=false;
}
}
}
int main()
{
init();
int n;
scanf("%d",&n);
int d=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
d=__gcd(d,a[i]);
}
for(int i=1;i<=n;i++)
{
a[i]/=d;
for(int j=0;prime[j]*prime[j]<=a[i];j++)
{
if(a[i]%prime[j]==0)
{
p[prime[j]]++;
while(a[i]%prime[j]==0)
a[i]/=prime[j];
}
}
if(a[i]!=1)
p[a[i]]++;
}
int ans=n;
for(int i=2;i<=maxn;i++)
{
ans=min(ans,n-p[i]);
}
if(ans==n) printf("-1\n");
else printf("%d\n",ans);
return 0;
}