题意:求出2008^N所有因数对的和对k取余的结果M。再求2008^M对k取余的结果。
题解:
- 2008 = 2^3 * 251^1
- 2008^N = 2^(3N) * 251^N
- 因子和用排列组合计算为:∑2^i * 251^j (i from 0 to 3N, j from 0 to N);
- 先固定j,2^0 + 2^1 + …… + 2^3N = 2^(3N+1) - 1 = s1
- 再固定i,251^0 + 251^1 + …… + 251^N = (251^(N+1) - 1) / 250 = s2 / 250
- 所以m = (s1*s2 / 250) % k = (s1 * s2) % (250 * k) / 250(此处用到公式:a/b % p = a % (b * p) / p)
- 最后快速幂处理。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k,m,sum;
ll power(ll a,ll n,ll mod){
ll ans = 1;
while(n){
if(n&1) ans = ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return ans;
}
int main(){
while(~scanf("%lld%lld",&n,&k)){
if(!n && !k) break;
m = (power(2,3*n+1,250*k) - 1) * (power(251,n+1,250*k) - 1) % (250 * k) / 250;
printf("%lld\n",power(2008,m,k));
}
return 0;
}