题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2605
A^X mod P
打表求解,不然会超时!!!http://blog.youkuaiyun.com/i_am_a_winer/article/details/44905701
他说相当于dp,但我感觉其实就是一道数论题,用快速幂会TLE,而且1 <= m, P <= 10^9数组存不下,但反过来想想,任意自然数都可以拆分为两个自然数数,n=k*x+y;根据这,打两张表记录即可,然后再按照题意求解就行了。。。
#include<iostream>
#include<cstdio>
#define HH 33000
#define GG 33000
using namespace std;
typedef long long ll;
ll dp1[33350];
ll dp2[33350];
void init(ll A,ll P)
{
ll i;
dp1[0]=dp2[0]=1;
dp1[1]=A;
for(i=2;i<=HH;i++)
dp1[i]=(dp1[i-1]*A)%P;
dp2[1]=dp1[HH];
for(i=2;i<=GG;i++)
dp2[i]=(dp1[HH]*dp2[i-1])%P;
}
ll fun(ll K,ll n,ll A,ll a,ll b,ll m,ll P)
{
ll ans=0,i,j,tmp;
tmp=K;
for(i=1;i<=n;i++)
{
ans=(ans+dp2[tmp/HH]*dp1[tmp%HH])%P;
tmp=(a*tmp+b)%m;
}
return ans;
}
int main()
{
ll T,n,A,K,a,b,m,P,i,tmp;
int t=1;
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&A,&K,&a,&b,&m,&P);
init(A,P);
tmp=fun(K,n,A,a,b,m,P);
printf("Case #%d: %d\n",t++,tmp);
}
return 0;
}