hdu-4933-Miaomiao's Function(BC#4 1003)

来源:互联网 发布:c语言多线程函数 编辑:程序博客网 时间:2024/05/21 17:35

有的时候真是无力吐槽。。。G++ AC,C++ WA。这是什么心态。。。

这道题目耗费了半个小时写代码,却用了两天debug()........

dp[i][j][k]:

i为0||1,当i=0时代表L,i=1时代表R

第i状态下,数字j出现的次数为10^k次有多少种情况。

然后把i为1的剪掉i为0的。

然后算出最终的answer数组。

然后根据answer数组算出最后的f,这里有一个trick,当answer<0时,如果answer%9==0,那么f=9.因为当answer小于0时

算出的f大于0;

然后根据f算出最后的答案。。。

#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <assert.h>#include<iostream>using namespace std;#define MAXN 10050#define LL __int64int dp[2][10][110];int num[110];void dos(char str[],int leap){    int n=strlen(str);    for(int i=0;i<n;i++)    {        num[i+1]=str[i]-'0';    }    if(leap==0)    {        if(n==1&&num[1]==0)return;        num[n]--;        int x=n;        while(num[x]<0)        {            num[x]+=10;            num[x-1]--;            x--;        }        if(num[1]==0)        {            n--;            for(int i=1;i<=n;i++)            {                num[i]=num[i+1];            }        }    }    for(int i=1;i<=n;i++)    {        for(int j=1;j<=9;j++)        {            int x=n-i;            if(i!=1)            {                dp[leap][j][x]++;            }            for(int k=1;k+x+1<n;k++)            {                if(k%2)dp[leap][j][x+k-1]-=9;                else dp[leap][j][x+k-1]+=9;            }            for(int k=1;k<i;k++)            {                if(i%2==0)dp[leap][j][n-k-1]-=(num[k]);                else dp[leap][j][n-k-1]+=(num[k]);                if(k==1)                {                    if(i%2==0)dp[leap][j][n-k-1]-=(-1);                    else dp[leap][j][n-k-1]+=(-1);                }            }            if(j>num[i])continue;            if(j<num[i])            {                if(i%2==0)dp[leap][j][x]-=1;                else dp[leap][j][x]+=1;                continue;            }            for(int k=i+1;k<=n;k++)            {                if(i%2==0)dp[leap][j][n-k]-=num[k];                else dp[leap][j][n-k]+=num[k];                if(k==n)                {                    if(i%2==0)dp[leap][j][n-k]-=1;                    else dp[leap][j][n-k]+=1;                }            }            if(i==n)            {                if(i%2==0)dp[leap][j][0]-=1;                else dp[leap][j][0]+=1;            }        }    }}void hebing(){    for(int i=0;i<=100;i++)    {        for(int j=1;j<=9;j++)        {            dp[0][j][i]=dp[1][j][i]-dp[0][j][i];        }    }}int ans[220];int fuhao;int qian()//使用负数{    int len=0;    for(int i=0;i<=100;i++)    {        int x=0;        for(int j=1;j<=9;j++)        {            x+=dp[0][j][i]*j;        }        ans[i]=x;    }    int x=0;    for(int i=0;i<=100;i++)    {        x=ans[i];        if(x!=0)len=i;        else continue;        if(x<0)        {            x=-x;            ans[i]=x%10;            ans[i]=-ans[i];            x=-x;        }        else ans[i]=x%10;        ans[i+1]+=x/10;    }    while(x!=0)    {        len++;        if(x<0)        {            x=-x;            ans[len]=x%10;            ans[len]=-ans[len];            x=-x;        }        else ans[len]=x%10;        x=x/10;    }    while(ans[len]==0)len--;    if(ans[len]<0)fuhao=0;    else fuhao=1;    if(fuhao==0)    {        for(int i=0;i<=len;i++)ans[i]=-ans[i];    }    for(int i=0;i<=len;i++)    {        if(ans[i]<0)        {            while(ans[i]<0)            {                ans[i]+=10;                ans[i+1]--;            }        }    }    if(fuhao==0)    {        for(int i=0;i<=len;i++)ans[i]=-ans[i];    }    return len;}int getf(int len){    int x=0;    int y=0;    for(int i=0;i<=len;i++)    {        x+=ans[i];        y=y*10-ans[i];        y=y%9;    }    if(fuhao==0)    {        y=-y;        while(y<=0)y+=9;        return y;    }    while(x>=10)    {        int y=0;        while(x)        {            y+=x%10;            x=x/10;        }        x=y;    }    return x;}void out(int f,int len){    int aa=0;    int y=0;    for(int i=len;i>=0;i--)    {        aa=aa*10+ans[i];        aa=aa%f;        y=y*10-ans[i];        y=y%f;    }    if(fuhao==0)    {        y=-y;        cout<<(y%f+f)%f<<endl;        return;    }    aa=(aa+f)%f;    cout<<aa<<endl;}char stl[110];char str[110];int main(){    int T,n;    scanf("%d",&T);    while(T--)    {        memset(dp,0,sizeof(dp));        memset(ans,0,sizeof(ans));        scanf("%s%s",stl,str);        dos(stl,0);        dos(str,1);        hebing();        int len=qian();        LL f=getf(len);        if(f==0)        {            cout<<"Error!"<<endl;        }        else        {            out(f,len);        }    }    return 0;}


1 0
原创粉丝点击