hdu2837数论

时间:2022-07-25 19:52:15

http://acm.hdu.edu.cn/showproblem.php?pid=2837

// a^b%p=a^(b%phi(p)+phi(p))%p
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<bitset>
#include<iomanip> using namespace std;
#define INT long long INT euler( int n)
{
INT ret=1,i;
for (i=2;i*i<=n;i++)
if (n%i==0){
n/=i,ret*=i-1;
while (n%i==0)
n/=i,ret*=i;
}
if (n>1)
ret*=n-1;
return ret;
} INT Pow( INT a , INT b , INT m )
{
INT ans = 1 ;
while( b )
{
if( b & 1 )
{
ans = ans * a % m ;
}
a *= a ;
a %= m ;
b >>= 1 ;
}
return ans % m ;
} INT fun2( int a , int b , int m )
{
INT ans = 1 ;
for( int i = 1 ; i <= b ; ++i )
{
ans *= a ;
if( ans >= m )
return ans ;
}
return ans ;
} INT fun1( int n , int m )
{
INT phi = euler( m ) ;
if( n < 10 )
return n ;
INT a = fun1( n / 10 , phi ) ;
INT b = fun2( n % 10 , a , m ) ;
if( b >= m )
{
INT ans = Pow( n % 10 , a + phi , m ) ;
if( ans == 0 )
ans += m ;
return ans ;
}
return b ;
} int main()
{
int Case , n , m , p ;
cin >> Case ;
while( Case-- )
{
cin >> n >> m ;
INT ans = fun1( n , m ) % m ;
cout << ans << endl ;
}
return 0 ;
}