Problem Description:
Read the program below carefully then answer the question.
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include<iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include<vector>
const int MAX=100000*2;
const int INF=1e9;
int main()
{
int n,m,ans,i;
while(scanf("%d%d",&n,&m)!=EOF)
{
ans=0;
for(i=1;i<=n;i++)
{
if(i&1)ans=(ans*2+1)%m;
else ans=ans*2%m;
}
printf("%d\n",ans);
}
return 0;
}
Input:
Multi test cases,each line will contain two integers n and m. Process to end of file.
[Technical Specification]
1<=n, m <= 1000000000
Output:
For each case,output an integer,represents the output of above program.
Sample Input:
1 10
3 100
Sample Output:
1
5
通过观察发现当n为偶数时,第n项为a = (2^(n+1)-2)/3;当n为奇数时,第n项为a = (2^(n+1)-1)/3,由于要对m取余,那么结果ans = a/3%m,这里要用到数模计算公式:a/b%m = a%(b*m)/b,所以ans = a%3m/3。
#include<stdio.h> #include<string.h> #include<queue> #include<math.h> #include<stdlib.h> #include<algorithm> using namespace std; const int N=1e4+10; const int INF=0x3f3f3f3f; const int MOD=1e9+7; typedef long long LL; LL Solve(LL a, LL b, LL m) ///快速幂 { LL t, sum; t = a % m; sum = 1; while (b) { if(b&1) sum = (sum*t)%m; t = (t*t)%m; b /= 2; } return sum; } int main () { LL n, m, ans; while (scanf("%lld %lld", &n, &m) != EOF) { ans = Solve(2, n+1, 3*m); if (n % 2 == 0) ans = (ans-2)/3; else ans = (ans-1)/3; printf("%lld\n", ans); } return 0; }