CodeForces Beta Round #17 D. Notepad

Pythonゲーキタ━━━(゚∀゚)━( ゚∀)━(  ゚)━(  )━(  )━(゚  )━(∀゚ )━(゚∀゚)━━━!!!!!

b,n,c = [int(x) for x in raw_input().split()]
print ((b-1)*pow(b,n-1,c)+c-1)%c+1

→Time limit exceeded orz

2行目は問題無いのだけど、1行目の読み込みに時間がかかる。10進数のまま冪剰余を計算するようにしたが、それでもPythonだと時間が足りない。桁があふれた時に、自動的に多倍長整数に拡張する仕様のせいじゃないかと思う。

#include <iostream>
#include <string>

using namespace std;

long long pow( long long a, int b, int c )
{
    long long r = 1;
    for ( int i=0; i<b; i++ )
        r = r * a % c;
    return r;
}

int main()
{
    string bs, ns;
    int c;
    cin >> bs >> ns >> c;

    //  b %= c
    long long b = 0;
    for ( int i=0; i<(int)bs.size(); i++ )
        b = ( b * 10 + bs[i]-'0' ) % c;

    //  n -= 1
    for ( int i=(int)ns.size()-1; ; i-- )
        if ( ns[i] != '0' )
        {
            ns[i] -= 1;
            break;
        }
        else
            ns[i] = '9';

    //  p = (b-1) * b^(n-1) % c
    long long p = 1;
    for ( int i=0; i<(int)ns.size(); i++ )
        p = pow(p,10,c) * pow(b,ns[i]-'0',c) % c;
    p = p * (b+c-1) % c;

    cout << ( p + c - 1 ) % c + 1 << endl;
}