B - 等分数字串
给定一个只包含0-9的字符串S,请你判断能否将S划分为两个或两个以上连续的子串,使得每一个子串中的数字总和都相等。
Input
输入包含多组数据。
第一行包含一个整数N,代表数据组数。
以下N行,每行包含一个字符串S。
对于50%的数据,2 ≤ |S| ≤ 100
对于100%的数据,1 ≤ N ≤ 5, 2 ≤ |S| ≤ 100000
Output
对于每组数据,输出一行,内容是YES或者NO,代表是否存在题目要求的划分方案。
Sample Input
3 1248 2680 54174760
Sample Output
NO YES YES
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cmath>
#define show(a) cout<<#a<<"="<<a<<endl
#define MAXN 1005
using namespace std;
int prime(int x)
{
for(int i=2; i<sqrt(x)+1; i++)
{
if(x%i==0) return i;
}
return 0;
}
int main()
{
int num;
scanf("%d",&num);
for(int i=0; i<num; i++)
{
string s;
cin>>s;
//cout<<s.length()<<endl;
int sum=0,maxn=0;
for(int i=0; i<s.length(); i++)
{
sum+=s[i]-'0';
maxn=max(maxn,s[i]-'0');
}
int now=(prime(sum)==0?1:sum/prime(sum)),group;
while(now>=maxn)
{
//show(now);
int cnt=0;
group=0;
int i;
for(i=0; i<s.length(); i++)
{
cnt+=s[i]-'0';
//show(cnt);
if(cnt==now)
{
cnt=0;
group++;
}
if(cnt>now)
break;
}
if(sum==group*now&&group>1)
{
break;
}
now--;
while(now>0&&sum%now!=0)
{
now--;
}
}
if(s.length()>1&&now>=maxn)
cout<<"YES\n";
else
cout<<"NO\n";
}
}