hdu A Simple Stone Game

来源:互联网 发布:学说四川话的软件 编辑:程序博客网 时间:2024/05/18 02:37

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=6237

题解:

stm看的时候没看到每次只能取一个,蛇皮了半天。唉。。。。。。
直接暴力枚举质因子就行了。
PS:这里处理质因子的时候,只要在线直接处理就行了,如果进行离线处理会RE的。

代码:

#include <map>#include <cmath>#include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define met(a,b) memset(a,b,sizeof(a))#define inf 0x7fffffffconst int maxn = 1e5+10;typedef long long ll;ll num[maxn];int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        ll ans=0;        for(int i=0;i<n;i++)        {            scanf("%lld",&num[i]);            ans+=num[i];        }        vector<ll>prime;        prime.clear();        for(ll i=2;i*i<=ans;i++)        {            if(ans%i==0)            {                prime.push_back(i);                while(ans%i==0)                    ans/=i;            }        }        if(ans>1)            prime.push_back(ans);        sort(prime.begin(),prime.end());        vector<ll>pp;        ll sum=0;        ll cnt=0;        ll MIN=1e10+10;        for(int i=0;i<(int)prime.size();i++)        {            sum=0;            pp.clear();            for(int j=0;j<n;j++)            {                ll temp=num[j]%prime[i];                if(temp)                {                    pp.push_back(temp);                    sum+=temp;                }            }            sort(pp.begin(),pp.end());            cnt=0;            for(int j=(int)pp.size()-1;j>=0;j--)            {                cnt+=prime[i]-pp[j];                sum-=prime[i];                if(sum<=0)                    break;            }            MIN=min(MIN,cnt);        }        printf("%lld\n",MIN);    }}