已退役


私信TA

用户名:15893197790

访问量:14398

签 名:

努力学习,积极生活。

等  级
排  名 389
经  验 5119
参赛次数 0
文章发表 43
年  龄 0
在职情况 学生
学  校 南京大学
专  业 计算机科学与技术

  自我简介:

已退役。研究生方向为AI+软件工程,欢迎学术交流!

解题思路:简单的思维题

注意事项:这一题之所以会出现标答超时,是因为有一组数据是第一行什么都没有,第二行才有一个数字(因为我氪金了,能看数据集)。用scanf("%s",str)的方法可以完美解决这种问题,代码的鲁棒性是需要学习的。

参考代码:

#include

using namespace std;

typedef long long ll;

#define mod 20123

#define maxn 105

int x[maxn];

char str[maxn];

int h[maxn],l[maxn];

int n;

int ans1[maxn],ans2[maxn];//ans1[i]表示第i位为1时的数个个数,ans2[i]表示第i位为2时的数个个数

int ans11,ans22;

int fuzhu[maxn];//fuzhu[i]就是10^i%mod

int getl(int n){

    int ret=0;

    for(int i=n-1;i>=1;i--){

        ret*=10;

        ret+=x[i];

        ret%=mod;

    }

    return ret;

}

void getfuzhu(){

    int num=1;

    fuzhu[0]=num;

    for(int i=1;i<=n;i++){

        num*=10;

        num%=mod;

        fuzhu[i]=num;

    }

}

int main(){

    scanf("%s",str+1);

    n=strlen(str+1);

    for(int i=1;i<=n;i++)x[i]=str[n+1-i]-'0';

    h[n]=0;

    for(int i=n-1;i>=1;i--){

        h[i]=h[i+1]*10+x[i+1];

        h[i]%=mod;

    }

    for(int i=1;i<=n;i++){

        l[i]=getl(i);

    }

    getfuzhu();

    for(int i=1;i<=n;i++){

        if(x[i]>1)ans1[i]=((h[i]+1)*fuzhu[i-1])%mod;

        else if(x[i]==1)ans1[i]=(h[i]*fuzhu[i-1]+l[i]+1)%mod;

        else ans1[i]=(h[i]*fuzhu[i-1])%mod;

        ans11+=ans1[i];

    }

    ans11%=mod;

    for(int i=1;i<=n;i++){

        if(x[i]>2)ans2[i]=((h[i]+1)*fuzhu[i-1])%mod;

        else if(x[i]==2)ans2[i]=(h[i]*fuzhu[i-1]+l[i]+1)%mod;

        else ans2[i]=(h[i]*fuzhu[i-1])%mod;

        ans22+=ans2[i];

    }

    ans22%=mod;

    printf("%d",(ans11+ans22)%mod);

    //system("pause");

    return 0;

}


 

0.0分

1 人评分

  评论区

  • «
  • »