该说是字符串题目呢还是数论题目呢。
这题因为有字符串嵌套,所以最好还是拿递归来写。在构思递归的时候考虑到了要传什么参数的问题,每个递归函数传两个参数,对应的字符串长度,以及这一段的值。一开始估计错了数据范围,计算值的时候直接无脑乘积的,然后就TLE了。。。后来换了快速幂来实现,才AC。
#include "cstdio" #include "cstring" #define LL long long char s[1111]; LL m; struct node{ int len; LL v; }; LL mul_mod(LL a,LL b,LL c) { LL ret=0,tmp=a%c; while(b) { if(b&0x1)if((ret+=tmp)>=c)ret-=c; if((tmp<<=1)>=c)tmp-=c; b>>=1; } return ret; } LL pow_mod(LL a,LL p,LL n){ if(p==0) return 1%n; LL ans=pow_mod(a,p/2,n); ans=mul_mod(ans, ans, n); if(p%2==1) ans=mul_mod(ans, a, n); return ans%n; } node solve(int start,int end){ node ans; LL base=0; int len=0; int cnt; int flag1,flag2; for(int i=start;i<=end;) { if(s[i]!='['){ base=(10*base+s[i]-'0')%m; len++; i++; } else{ cnt=1; for(int j=i+1;;j++){ if(s[j]=='[') cnt++; else{ if(s[j]==']') cnt--; } if(cnt==0){ flag1=j-1; flag2=s[j+1]-'0'; break; } } node res=solve(i+1,flag1); for(int k=0;k<flag2;k++){ base=base*pow_mod(10,res.len,m); base=(base+res.v)%m; } i=flag1+3; len+=res.len*flag2; } } base=(base+m)%m; ans.len=len,ans.v=base; return ans; } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%s%lld",s,&m); int len=(int)strlen(s); node ans=solve(0,len-1); printf("%lld\n",(ans.v+m)%m); } return 0; }
FZU 2108 MOD problem
最新推荐文章于 2020-09-26 12:04:49 发布