HDU4686An Arc of Dream(矩阵构造****+矩阵快速幂+模运算)

An Arc of Dream is a curve defined by following function: 


where 
a 0 = A0 
a i = a i-1*AX+AY 
b 0 = B0 
b i = b i-1*BX+BY 
What is the value of AoD(N) modulo 1,000,000,007?

Input

There are multiple test cases. Process to the End of File. 
Each test case contains 7 nonnegative integers as follows: 

A0 AX AY 
B0 BX BY 
N is no more than 10 18, and all the other integers are no more than 2×10 9.

Output

For each test case, output AoD(N) modulo 1,000,000,007.

Sample Input

1
1 2 3
4 5 6
2
1 2 3
4 5 6
3
1 2 3
4 5 6

import java.util.Arrays;
import java.util.Scanner;

public class Main{
	static long N;
	static long AO,AX,AY;
	static long BO,BX,BY;
	static long inf=1000000007;
	
	static G_ multimod(G_ a,G_ b){//矩阵乘法
		G_ res=new G_();
		for(int i=0;i<5;i++){
			for(int j=0;j<5;j++){
				for(int k=0;k<5;k++){
					res.dd[i][j]=(res.dd[i][j]+a.dd[i][k]*b.dd[k][j]%inf)%inf;
				}
			}
		}
		return res;
	}
	
	static G_ multi(G_ a,G_ b){//快速幂
		G_ ans=new G_();
		ans=b;
		long n=N-1;
		while(n>0){
			if((n&1)==1){ans=multimod(a,ans);	}
			n>>=1;
			a=multimod(a,a);
		}
		return ans;
	}

		
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			N=sc.nextLong();						
			AO=sc.nextLong();
			AX=sc.nextLong();
			AY=sc.nextLong();
			BO=sc.nextLong();
			BX=sc.nextLong();
			BY=sc.nextLong();
			
			if(N==0){
				System.out.println("0");
				continue;
			}
			
			G_ A=new G_();
			long a1=AX*BX%inf;
			long a2=AX*BY%inf;
			long a3=AY*BX%inf;
			long a4=AY*BY%inf;
			long a5=AX%inf;
			long a6=AY%inf;
			long a7=BX%inf;
			long a8=BY%inf;//初始化矩阵Q
			A.dd[0][0]=1;A.dd[0][1]=a1;A.dd[0][2]=a2;A.dd[0][3]=a3;A.dd[0][4]=a4;
			A.dd[1][0]=0;A.dd[1][1]=a1;A.dd[1][2]=a2; A.dd[1][3]=a3; A.dd[1][4]=a4;
			A.dd[2][0]=0;A.dd[2][1]=0;A.dd[2][2]=a5;A.dd[2][3]=0;   A.dd[2][4]=a6;
			A.dd[3][0]=0;A.dd[3][1]=0;A.dd[3][2]=0;  A.dd[3][3]=a7; A.dd[3][4]=a8;
			A.dd[4][0]=0;A.dd[4][1]=0;A.dd[4][2]=0;  A.dd[4][3]=0;   A.dd[4][4]=1;
			G_ B=new G_();
			B.dd[0][0]=AO*BO%inf;//初始化矩阵p
			B.dd[1][0]=AO*BO%inf;
			B.dd[2][0]=AO%inf;
			B.dd[3][0]=BO%inf;
			B.dd[4][0]=1;
			
			G_ res=new G_();
			
			res= multi(A,B);
			System.out.println(res.dd[0][0]);
			
			
		}				
	}
}
class G_{
	long dd[][]=new long[5][5];
	G_(){
		for(int i=0;i<5;i++)
			Arrays.fill(dd[i],0);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值