大数删除k位是否能整除3,MG loves apple(HDU)

传送门

MG loves apple

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 442    Accepted Submission(s): 76
Problem Description
MG is a rich boy. He has  n apples, each has a value of V( 0<=V<=9). 

A valid number does not contain a leading zero, and these apples have just made a valid  N digit number. 

MG has the right to take away  K apples in the sequence, he wonders if there exists a solution: After exactly taking away  K apples, the valid  NK digit number of remaining apples mod  3 is zero. 

MG thought it very easy and he had himself disdained to take the job. As a bystander, could you please help settle the problem and calculate the answer?
Input
The first line is an integer  T which indicates the case number.( 1<=T<=60)

And as for each case, there are  2 integer  N(1<=N<=100000), K(0<=K < N) in the first line which indicate apple-number, and the number of apple you should take away.

MG also promises the sum of  N will not exceed  1000000

Then there are  N integers  X in the next line, the i-th integer means the i-th gold’s value( 0<=X<=9).
Output
As for each case, you need to output a single line.

If the solution exists, print”yes”,else print “no”.(Excluding quotation marks)
Sample Input
 
   
2 5 2 11230 4 2 1000
Sample Output
 
   
yes no
 
Source
BestCoder Round #93
题意:求去掉KK位数字后,不含前导零,且数字和是否能被三整除。
 

我们设S0S0S1S1S2S2分别为原串上mod 3=0mod3=01122数字的个数。 我们假定删除取模后为001122的数字各AaBbCc个,则显然有0<=A<=S0,0<=B<=S1,0<=C<=S20<=A<=S0,0<=B<=S1,0<=C<=S2K=A+B+CK=A+B+CSum 

mod3=(A0+B1+C2)mod3=(S00+S11+S22)mod3=bias 。 枚举 CC 的值,我们可得

mod 3=(A*0+B*1+C*2)mod 3=(S0*0+S1*1+S2*2)mod 3=biasB mod 3=(bias-C*2)mod 3,A=K-B-CBmod3=(biasC2)mod3,A=KBC。如果有若干组A,BA,B不逾界,可知这些(A,B,C)(A,B,C)是在模意义下合法的解,但不一定满足没有前导零。

所以,对于【大于00的数】我们贪心地从后往前删除,对于00我们贪心地从前往后删除。

需要统计出:a3E3=第一个【mod 3=0mod3=0且非00的数】前00的个数(如果mod 3=0mod3=0且非00的数不存在,那么a3a3就取所有零的个数),E1E1=【第一个00前是否存在mod 3=1mod3=1的数】,E2E2=【第一个00前是否存在mod 3=2mod3=2的数】。

则以下情况满足任一种都能保证无前导零:A>=a3A>=E3B<B<S1S1E1E1C<C<S2S2E2E2


还需要加一种情况 满足k==n-1 也是yes:

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long int
#define inf 0x3f3f3f3f
#define N 100010
using namespace std;
char aa[N];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,k,s0=0,s1=0,s2=0,E1=0,E2=0,E3=0,flagE3=1,flagE1=1,flagE2=1;
        scanf("%d%d",&n,&k);
        scanf("%s",aa);
        int sum=0;
        for(int i=0;i(sum-c*2)%3可能为-1或-2或0,1,2加上3之后再取余3,余数一定为非负。
            for(int b=minb;b<=s1;b+=3)
            {
                int a=k-b-c;
                if(a>=0&&a<=s0)
                {
                    if((a>=E3)||(b
再推荐一道好题:https://oj.ejq.me/problem/24  (大数整除6的最大位数)

我的博客http://blog.csdn.net/xiangaccepted/article/details/69951928有这道题的解法(用的是dp);





 
   

你可能感兴趣的:(杭电,思路题,比赛总结,大数整除3,HDU,思路题)