Reading comprehension
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1286 Accepted Submission(s): 515
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;
}
#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
[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和m太大,直接枚举肯定会TLE,所以观察可以知道当n为奇数时,ans=(4的(n/2+1)次方-1)/3 偶数时等于它的前一个奇数的ans乘以2
注意有ans/3%m会出错,又不能用乘法逆元。所以我们可以转换为ans%(3*m)/3 然后全部对3*m取模即可
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
long long pow_mod(long long a,long long n,long long m)
{
long long ans=1;
while(n)
{
if(n&1) ans=ans*a%m;
a=a*a%m;
n>>=1;
}
return ans;
}
int main()
{
long long n,m;
while(~scanf("%lld %lld",&n,&m))
{
if(n==1&&m==1) {
printf("0\n");
continue;
}
long long ans;
if(n&1)
ans=(pow_mod(4,n/2+1,3*m)-1)%(3*m)/3;
else
{
ans=(pow_mod(4,(n-1)/2+1,3*m)-1)%(3*m)/3;
ans=ans*2%m;
}
printf("%lld\n",ans);
}
return 0;
}