zoukankan      html  css  js  c++  java
  • hdu 1005 快速幂

    Number Sequence

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 93488    Accepted Submission(s): 22297


    Problem Description
    A number sequence is defined as follows:

    f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

    Given A, B, and n, you are to calculate the value of f(n).
     
    Input
    The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.
     
    Output
    For each test case, print the value of f(n) on a single line.
     
    Sample Input
    1 1 3 1 2 10 0 0 0
     
    Sample Output
    2 5
     
    Author
    CHEN, Shunbao
     
    Source
     
    Recommend
    JGShining   |   We have carefully selected several similar problems for you:  1008 1021 1019 1009 1012
     
    import java.util.Scanner;
    
    
    public class Main {
    
    	static void print(int[][] m){
    		System.out.println();
    		for(int i=0; i<2; i++){
    			for(int j=0; j<2; j++)
    				System.out.print(m[i][j]+" ");
    			System.out.println();
    		}
    	}
    	
    	static void mul(int[][] a, int[][] b){
    		int[][] c = new int[2][2];
    		for(int i=0; i<2; i++)
    			for(int j=0; j<2; j++){
    				c[i][j]=0;
    				for(int k=0; k<2; k++)
    					c[i][j] = (c[i][j] + a[i][k]*b[k][j])%7;
    			}
    		for(int i=0; i<2; i++)
    			for(int j=0; j<2; j++) b[i][j]=c[i][j];
    	}
    	
    	public static int quickPower(int n, int a, int b){
    		int[][] m = {{1,0},{1,0}};
    		int[][] g = {{a,b},{1,0}};
    		while(n>0){
    			if((n & 1) == 1) mul(g,m);
    			mul(g,g);
    			n>>=1;
    		}
    //		print(m);
    		return m[0][0];
    	}
    	
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner s = new Scanner(System.in);
    		while(true){
    			int a = s.nextInt(), b=s.nextInt(),n=s.nextInt();
    			if(a==0 && b==0 && n==0) break;
    			int ans = n < 3 ? 1 : quickPower(n-2, a, b);
    			System.out.println(ans);
    		}
    	}
    }
    
  • 相关阅读:
    [题解] [HNOI2014] 世界树
    [luogu 5301][bzoj 5503] [GXOI/GZOI2019] 宝牌一大堆
    [HDU4507]吉哥系列故事——恨7不成妻
    [国家集训队]聪聪可可
    [模板]点分治
    [2018.8.12]模拟赛B组
    JZOJ5804. 【2018.08.12提高A组模拟】简单的序列
    2018.8.10模拟赛
    2018.8.8模拟赛
    [2018.8.6]模拟赛
  • 原文地址:https://www.cnblogs.com/ramanujan/p/3582532.html
Copyright © 2011-2022 走看看