题目要求求
2008^n的因子和m
然后求2008^m mod k的得数
求因子和就用我上次的思路
然后就说说接下来注意的地方
我们可以知道m=(2^(3n+1)-1)*(251*(n+1)-1)/250 由于K不固定,所以不能用上次逆元的思路
但是m=(x/250) %k
所以m=(x mod(250*k))/250;
然后在用快速幂计算2008^m mod k
代码如下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
long long cal (long long b,long long n,long long mod){
long long ans=1;
while(n){
if(n&1) ans=(ans*b)%mod;
b=(b*b)%mod;
n>>=1;
}
return ans;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("1.cpp", "r", stdin);
#endif // ONLINE_JUDGE
int n,k;
while(scanf("%d%d",&n,&k)!=EOF){
if(n==0&&k==0) break;
long long mod=250*k;
long long a=cal(2,3*n+1,mod)-1;
long long b=cal(251,n+1,mod)-1;
if(a<0) a+=mod;
if(b<0) b+=mod;
long long m=(a*b)%mod;
m/=250;
long long ans=cal(2008,m,k);
printf("%I64d\n",ans);
}
return 0;
}