HDU 4990(找规律+构造矩阵快速幂)
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
思路:
代码:
一开始错了好几次,用long才对,所以以后都用long完事
import java.util.Arrays;
import java.util.Scanner;
public class main10 {
static long n,m;
static int max=3;
public static long[][] multi(long a[][],long b[][]){
long res[][]=new long [max][max];
for(int i=0;i<max;i++)
Arrays.fill(res[i], 0);
for(int i=0;i<max;i++)
for(int j=0;j<max;j++)
for(int k=0;k<max;k++)
res[i][j]=(res[i][j]+a[i][k]*b[k][j]%m)%m;
return res;
}
public static long[][] quick_pow( long a[][]){
long res[][]=new long[max][max];
for(int i=0;i<max;i++)
for(int j=0;j<max;j++)
if(i==j) res[i][j]=1;
else res[i][j]=0;
long b=n-2;
while(b!=0){
if((b&1)==1) res=multi(res,a);
b>>=1;
a=multi(a,a);
}
return res;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
n=scan.nextInt();
m=scan.nextInt();
if(n==1){
System.out.println(1%m);
continue;
}
else if(n==2){
System.out.println(2%m);
continue;
}
else{
long a[][]=new long[max][max];
for(int i=0;i<max;i++)
Arrays.fill(a[i], 0);
a[0][0]=a[0][2]=a[1][0]=a[2][2]=1;
a[0][1]=2;
long b[][]=new long[max][max];
b=quick_pow(a);
long c[][]=new long[max][max];
for(int i=0;i<max;i++)
Arrays.fill(c[i], 0);
c[0][0]=2; c[1][0]=1; c[2][0]=1;
c=multi(b,c);
System.out.println(c[0][0]);
}
}
}
}