Codeforces Beta Round #17 D题 福大核武 景润后人!!!

来源:互联网 发布:专业数据库恢复 编辑:程序博客网 时间:2024/06/10 01:14
D. Notepad
time limit per test
2 seconds
memory limit per test
64 megabytes
input
standard input
output
standard output

Nick is attracted by everything unconventional. He doesn't like decimal number system any more, and he decided to study other number systems. A number system with baseb caught his attention. Before he starts studying it, he wants to write in his notepad all the numbers of lengthn without leading zeros in this number system. Each page in Nick's notepad has enough space forc numbers exactly. Nick writes every suitable number only once, starting with the first clean page and leaving no clean spaces. Nick never writes number0 as he has unpleasant memories about zero divide.

Would you help Nick find out how many numbers will be written on the last page.

Input

The only input line contains three space-separated integers b, n and c (2 ≤ b < 10106,1 ≤ n < 10106,1 ≤ c ≤ 109). You may consider that Nick has infinite patience, endless amount of paper and representations of digits as characters. The numbers doesn't contain leading zeros.

Output

In the only line output the amount of numbers written on the same page as the last number.

Sample test(s)
Input
2 3 3
Output
1
Input
2 3 4
Output
4
Note

In both samples there are exactly 4 numbers of length3 in binary number system. In the first sample Nick writes3 numbers on the first page and 1 on the second page. In the second sample all the 4 numbers can be written on the first page.

是TXY叫我看这题的,说要用到EULER函数,然后看了一下,发现羊神跪了10次放弃了,搞得我不敢去敲,结果发现是TOURIST出的题,更让我跪了,后来她说WUST的人出

了这题,结果一看是阿峰出的= =表示抱着不服输的心态来看题了。。。

说白了就是让你求(b^n-1*(b-1))%c的值,如果为0输出c即可

思路:b n 大的都吓得鬼都见不得,字符读入来模拟,b好办,每次模拟过程中取模c即可,但是n怎么办,没膜拜过福大核武写的指数循环节博客的人基本只有GG的份,还好我膜拜过,所以知道可以用欧拉函数降幂也即A^Bmod C=(A^Bmodphi(C)+phi(C))modC来求解(千万注意要B>phi(c)时才能取模否则又是GG),这样TXY说的为什么要求EULER函数就很明显了,然后接下来就是EGGS PAIN的模拟了,对N的模拟分两部分,如果N模拟完毕之后都比C小,就直接快速幂,否则重新模拟,在模拟的过程中每次对phi(c)取模即可,这样N即使很大也能在多次降幂中把它给降下来,然后再进行快速幂即可,然后写的时候又忘了+phi(c)跪了一次T T,题意没完全读懂跪了两次,还好是比赛后可以看数据,如果真要是比赛的时候,尼玛知道做法到最后肯定还是跪的,最后,福大核武 景润后人,6666666!

#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;char b[1000005];char n[1000005];long long c;long long euler(long long n){    long long res=n;    for(long long i=2;i*i<=n;i++)    {        if(n%i==0)        {            res=res/i*(i-1);            while(n%i==0)            {                n/=i;            }        }    }    if(n!=1)    {        res=res/n*(n-1);    }    return res;}long long power(long long a,long long b,long long mod){    long long res=1;    while(b)    {        if(b&1)            res=(res*a)%mod;        a=(a*a)%mod;        b>>=1;    }    return res;}int main(){    cin>>b>>n>>c;    long long rb=0;    for(long long i=0;b[i]!='\0';i++)    {        rb=(rb*10+b[i]-'0')%c;    }    long long res=0;    long long phi=euler(c);    bool flag=0;    for(long long i=0;n[i]!='\0';i++)    {        res=(res*10+n[i]-'0');        if(res>c)        {            flag=1;            break;        }    }  // cout<<flag<<endl;    if(flag==1)    {        long long ans1=0;        //cout<<phi<<endl;        for(long long i=0;n[i];i++)        {            ans1=(ans1*10+n[i]-'0')%phi;           // cout<<ans1<<endl;            //return 0;        }        long long ans2=(ans1-1+phi)%phi;        long long pp=power(rb,ans1+phi,c);        long long qq=power(rb,ans2+phi,c);        if((pp-qq+c)%c)        cout<<(pp-qq+c)%c<<endl;        else            cout<<c<<endl;    }    else    {        long long nn=power(rb,res,c);        long long mm=power(rb,res-1,c);        if((nn-mm+c)%c)        cout<<(nn-mm+c)%c<<endl;        else            cout<<c<<endl;    }    return 0;}


0 0
原创粉丝点击