FZU 2108 MOD problem
2014-02-22 19:09
197 查看
该说是字符串题目呢还是数论题目呢。
这题因为有字符串嵌套,所以最好还是拿递归来写。在构思递归的时候考虑到了要传什么参数的问题,每个递归函数传两个参数,对应的字符串长度,以及这一段的值。一开始估计错了数据范围,计算值的时候直接无脑乘积的,然后就TLE了。。。后来换了快速幂来实现,才AC。
这题因为有字符串嵌套,所以最好还是拿递归来写。在构思递归的时候考虑到了要传什么参数的问题,每个递归函数传两个参数,对应的字符串长度,以及这一段的值。一开始估计错了数据范围,计算值的时候直接无脑乘积的,然后就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
- acm fzu 2108 Mod problem
- FZU 2108 Mod problem 数学与模拟
- FZU 2108(AC自动机)
- FZU 2108
- FZU 2108(dfs模拟,大数取余)
- FZU 2271 X (Floyd)(第七届福建省大学生程序设计竞赛)
- 【Floyd最短路】第七届福建省赛 FZU Problem 2271 X
- (fzu) Problem L Tic-Tac-Toe(水)
- FZU 2252 Yu-Gi-Oh!(枚举+贪心)
- fzu2275-kmp
- FZU 2109 奇偶
- FZU 2261 浪里个浪
- FZU 2282 Wand(错排+费马小定理)
- FZU - 2150 Fire Game
- FZU 2282 错排
- FZU 2278 期望
- FZU 2277 线段树+DFS序
- (矩阵快速幂)fzu1911 Construct a Matrix
- F - 检查站点 FZU - 2195(树的最长遍历,简单)