zoukankan      html  css  js  c++  java
  • FZU 2108 Mod problem

    参考这里:http://blog.csdn.net/q775968375/article/details/8828952

    大神说的没错,这跟建树没有半毛线的关系,就是一DFS。。。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 
     5 #define LL long long int
     6 
     7 const int MAXN = 1010;
     8 
     9 struct node
    10 {
    11     LL val, BitWide;
    12     node(): val(0), BitWide(0) { }
    13 };
    14 
    15 char str[MAXN];
    16 int MOD;
    17 
    18 LL Qmod( LL a, LL k )   //快速幂模板
    19 {
    20     LL v = 1;
    21     while ( k )
    22     {
    23         if ( k & 1 ) v = ( v * a ) % MOD;
    24         a = ( a * a ) % MOD;
    25         k >>= 1;
    26     }
    27     return v % MOD;
    28 }
    29 
    30 node DFS( int l, int r )
    31 {
    32     node ans;   //本层括号的数值
    33 
    34     int left, right, cnt;
    35     int top = 0;    //括号配对专用栈顶指针
    36     for ( int i = l; i <= r; ++i )
    37     {
    38         if ( str[i] == '[' )
    39         {
    40             if ( !top ) left = i + 1;
    41             ++top;
    42         }
    43         else if ( str[i] == ']' )
    44         {
    45             --top;
    46             if ( !top )  //找到一对配对括号
    47             {
    48                 right = i - 1;
    49                 ++i;
    50                 cnt = str[i] - '0';   //本括号内的内容的重复次数
    51                 node temp = DFS( left, right );   //求得本括号内的数的值,以及位数(10进制下)
    52 
    53                 LL base = Qmod( 10, temp.BitWide );   //括号内的数是10的多少次方
    54 
    55                 ans.BitWide += cnt * temp.BitWide;    //位数加上
    56                 ans.val = ( ans.val * Qmod( base, cnt ) ) % MOD;  //此括号的重复次数是10的多少次方
    57 
    58                 LL st = 1, BB = base;
    59 
    60                 while ( --cnt )        //这里不好解释,我费解了半天,等等画个图贴上来
    61                 {
    62                     st += BB;
    63                     BB = ( BB * base ) % MOD;
    64                     st %= MOD;
    65                 }
    66 
    67                 temp.val = (temp.val * st) % MOD;
    68                 ans.val = ( ans.val + temp.val ) % MOD;
    69             }
    70         }
    71         else if ( !top )
    72         {
    73             ans.val = ans.val * 10 + str[i] - '0';
    74             ans.val %= MOD;
    75             ++ans.BitWide;
    76         }
    77     }
    78 
    79     return ans;
    80 }
    81 
    82 int main()
    83 {
    84     int T;
    85     scanf( "%d", &T );
    86     while ( T-- )
    87     {
    88         scanf( "%s%lld", str, &MOD );
    89         node ans = DFS( 0, strlen(str) - 1 );
    90         printf("%lld\n", ans.val );
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    【APP问题定位(三)】adb安装
    【APP问题定位(一)】夜神模拟器安装及问题
    selenium_Alert
    selenium-iframe操作
    Python+selenium打开网页
    selenium 之 ActionChains (二)
    PyCharm汉化、破解教程
    selenim之ActionChains(一)
    C#连接数据库以及增、删、改、查操作
    C#飞行棋游戏
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/3078280.html
Copyright © 2011-2022 走看看