C. Raspberries
输入n个数,最少给这些数加几次可以让所以数乘积被k整除
题目中给出k的范围2<=k<=5,情况很少,分类讨论。
分析:只有当k=4的时候存在给两个数都+1的情况,其他k都只可以给一个数一直+1直到这个数可以mod k=0;
当k=4时单独考虑:
1.出现a[i]%k=1的数大于等于2,答案可以ans=min(ans,2)
2.出现a[i]%k=2的数大于等于2,答案可以ans=0
3.出现(a[i]%k=1的数量)>=1&&(a[i]%k=2的数量)>=1,答案可以ans=min((int)1,ans)
cpp
#include<iostream>
#include<algorithm>
#include<vector>
#define int long long
using namespace std;
const int INF=0x3f3f3f3f;
signed main()
{
int T;cin>>T;
while(T--)
{
int n,k;cin>>n>>k;
int a[n+2];
int ans=INF;
int cal=1;
for(int i=1;i<=n;i++)//选取一个数加到可以整除k
{
cin>>a[i];cal*=a[i];
if(a[i]%k==0){
ans=0;
}
int t=a[i]/k+1;
ans=min(ans,t*k-a[i]);
}
if(k==4)
{
int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++)
{
switch (a[i]%4)
{
case 1:
cnt1++;
break;
case 2:
cnt2++;
break;
case 3:
break;
default:
ans=0;
break;
}
}
if(cnt1>=2) ans=min((int)2,ans);
if(cnt2>=2) ans=0;
if(cnt1>=1&&cnt2>=1) ans=min((int)1,ans);
}
cout<<ans<<endl;
}
}