欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HDU 4990(找规律+构造矩阵快速幂)

程序员文章站 2022-07-03 21:03:07
...

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

思路:

 HDU 4990(找规律+构造矩阵快速幂)

代码:

 一开始错了好几次,用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]);
			 }
		 }
	}
}