FZU 2108 Mod problem 数学与模拟
2017-03-21 14:22
190 查看
把括号与它后面的第一个数看成一个单元,相邻单元之间的结果可以叠加上去,单元的结果由子单元的叠加值在求幂得出.。
(a*b)%c=(a%c)*(b%c)%c
code
(a*b)%c=(a%c)*(b%c)%c
ll Pow(ll n) { ll x=10,ans=1; ll len,mod,nl,mm; while(n) { if(n&1) { ans = (ll)ans*x; ans %= b; } x =(ll)x*x; x %= b; n >>= 1; } return ans; }
code
#include<iostream> using namespace std; typedef long long ll; struct node { ll len; ll mod; }; char s[1005]; ll b; int type,i,tt; node dfs(); int main() { int t; cin>>t; while(t--) { type=1; tt=1;i=0; cin>>s>>b; node ans=dfs(); cout<<ans.mod<<endl; } return 0; } ll Pow(ll n) { ll x=10,ans=1; ll len,mod,nl,mm; while(n) { if(n&1) { ans = (ll)ans*x; ans %= b; } x =(ll)x*x; x %= b; n >>= 1; } return ans; } node dfs() { ll mod=0,len=0; node aa,ans; for(;s[i];++ i) { if(s[i]=='[') { ++i; ans=dfs(); } else if(s[i]==']') { tt=0; aa.mod=mod;aa.len=len; return aa; } else { if(!tt) { ll nmod=ans.mod; ll nlen=ans.len; //cout<<ans.mod<<' '<<ans.len<<' '<<i<<endl; for(int j=1;j<s[i]-'0';j++) { ans.mod+=(ll)nmod*Pow(ans.len);ans.mod %=b; ans.len+=nlen; } tt=1; //cout<<ans.mod<<' '<<ans.len<<' '<<i<<endl; mod =(ll)mod*Pow(ans.len);mod%=b; mod +=ans.mod;mod %=b; len +=ans.len; } else { mod =mod*10+s[i]-'0'; mod %=b; len ++; } } } aa.mod=mod;aa.len=len; return aa; }
相关文章推荐
- FZU 2108 Mod problem
- acm fzu 2108 Mod problem
- FZU 2108 MOD problem
- FZU 2108(dfs模拟,大数取余)
- FZU 1492 地震预测(模拟链表)(技巧题)
- HDOJ 5595 GTW likes math(简单数学,模拟)
- 关于2014年考研数学冲刺模拟试题的编制问题(数三 V)
- jzoj 【2014.8.17NOIP普及组模拟】公牛数学
- FZU 1492 地震预测(模拟链表的应用)(Java实现)
- ZOJ 【2108】Agri-Net(最小生成树)模拟生成树&普利姆算法
- HDU-1006 Tick and Tick(模拟 + 区间交集 + 数学)
- codeforces864C(模拟、数学)
- CodeForces512C-Pluses everywhere-模拟/数学/排列组合模板
- hdu 4611 Balls Rearrangement(数学:推理+模拟)
- #个人赛第七场解题总结# (FZU 1881三角形问题 找规律 &&FZU 1884 排火车 模拟)
- (原创题)解方程 (数学+模拟)
- 【数学】【模拟】XMU 1044 伪伪随机数产生器
- POJ 3299 Humidex 模拟数学题
- FZU 2202 犯罪嫌疑人(模拟、推理)
- 表达式树+多项式模拟 fzu2215 Simple Polynomial Problem