您的位置:首页 > 其它

FZU 2108 Mod problem 数学与模拟

2017-03-21 14:22 190 查看
把括号与它后面的第一个数看成一个单元,相邻单元之间的结果可以叠加上去,单元的结果由子单元的叠加值在求幂得出.。

(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: