[2017百度之星程序设计大赛 - 复赛]A - hdu6144 B - hdu6145

这两道题都是属于模拟题,B题我弃坑了。

B题对于一个没有表达式的数,找出它的循环节。

对于一个表达式也是找出它展开后重复的部分,用快速幂和快速乘计算,首尾单独处理。

放一个A题

#include  
#include  
#include  
#define fo(i,a,b) for(i=a;i<=b;i++)  
#define fd(i,a,b) for(i=a;i>=b;i--)  
using namespace std;  
const int N=1e5+5;  
const int P=1e9+7;  
int n,m;  
char s[N],s1[N],ch[N],s2[N];  
int main()  
{  
    int T;  
    register int i,j;  
    scanf("%d",&T);  
    while (T--)  
    {  
        scanf("%s",s);  
        int len=strlen(s),m=0,i=0;  
        while (i<=len-1)  
        {  
            if (s[i]=='(')  
            {  
                int cnt=0;  
                i++;  
                while (s[i]!=')')  
                {  
                    ch[++cnt]=s[i];  
                    i++;  
                }  
                i+=3;  
                int cnt1=0;  
                while (s[i]!=')')  
                {  
                    s2[++cnt1]=s[i];  
                    i++;  
                }  
                int tim=0,c=1;  
                fd(j,cnt1,1)tim=(tim+1ll*(s2[j]-'0')*c%P)%P,c=1ll*c*10%P;  
                while (tim--)  
                {  
                    fo(j,1,cnt)s1[++m]=ch[j];  
                }  
                i++;  
            }  
            else  
            {  
                s1[++m]=s[i];  
                i++;  
            }  
        }  
        int ans=0,c=1;  
        fd(i,m,1)  
        {  
            ans=(ans+1ll*(s1[i]-'0')*c%P)%P;  
            c=1ll*c*10%P;  
        }  
        printf("%d\n",ans);  
    }  
}  

你可能感兴趣的:([2017百度之星程序设计大赛 - 复赛]A - hdu6144 B - hdu6145)