zoukankan      html  css  js  c++  java
  • LightOJ 1070 Algebraic Problem (推导+矩阵高速幂)

    题目链接:LightOJ 1070 Algebraic Problem

    题意:已知a+b和ab的值求a^n+b^n。结果模2^64。

    思路:

    1.找递推式


    得到递推式之后就是矩阵高速幂了

    注意:模2^64,定义成unsigned long long 类型,由于无符号类型超过最大范围的数与该数%最大范围 的效果是一样的。



    AC代码:

    #include<stdio.h>
    #include<string.h>
    #define LL unsigned long long
    
    struct Matrix {
    	LL m[10][10];
    };
    LL n;
    Matrix geti(LL n) {
    	LL i;
    	Matrix b;
    	memset(b.m,0,sizeof b.m);
    	for(i=0;i<2;i++)
    		b.m[i][i]=1;
    	return b;
    }
    
    Matrix matrixmul(Matrix a,Matrix b) {
    	LL i,j,k;
    	Matrix c;
    	for(i=0;i<2;i++) {
    		for(j=0;j<2;j++) {
    			c.m[i][j]=0.0;
    			for(k=0;k<2;k++) {
    				c.m[i][j]+=(a.m[i][k]*b.m[k][j]);
    			}
    		}
    	}
    	return c;
    }
    
    
    Matrix quickpow(Matrix a,LL p) {
    	Matrix m=a;
    	Matrix b=geti(n);
    	while(p) {
    		if(p%2)
    			b=matrixmul(b,m);
    		p/=2;
    		m=matrixmul(m,m);
    	}
    	return b;
    }
    
    
    int main() {
    	LL t;
    	LL p,q;
    	int cas=1;
    	Matrix pp,init,ans;
    	//printf("%llu
    ",kmod);
    	scanf("%llu",&t);
    	while(t--) {
    		scanf("%llu %llu %llu",&p,&q,&n);
    		memset(pp.m,0,sizeof pp);
    		pp.m[0][0]=p;
    		pp.m[0][1]=1;
    		pp.m[1][0]=-q;
    		pp.m[1][1]=0;
    
    		init.m[0][0]=p;
    		init.m[0][1]=2;
    		init.m[1][0]=0;
    		init.m[1][1]=0;
    
    		printf("Case %d: ",cas++);
    		if(n==0){
    			printf("%llu
    ",init.m[0][1]);
    		}
    		else if(n==1){
    			printf("%llu
    ",init.m[0][0]);
    		}
    		else {
    			ans=quickpow(pp,n-1);
    			ans=matrixmul(init,ans);
    			printf("%llu
    ",ans.m[0][0]);
    		}
    	}
    	return 0;
    }
    /*
    
     */


  • 相关阅读:
    排序算法
    chrome
    2017年末思考
    phpstorm修改创建文件时的默认注释
    男人
    Easyui-Tree和Combotree使用注意事项-sunziren
    Easyui-Treegrid使用注意事项-sunziren
    在生产环境中碰见的JSP木马-sunziren
    JS实现粒子拖拽吸附特效-sunziren
    双向链表的简单Java实现-sunziren
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6950908.html
Copyright © 2011-2022 走看看