LightOJ 1070 - Algebraic Problem 矩阵快速幂

来源:互联网 发布:windows如何打包tar 编辑:程序博客网 时间:2024/05/16 12:12

题链:http://lightoj.com/volume_showproblem.php?problem=1070

1070 - Algebraic Problem
PDF (English)StatisticsForum
Time Limit: 2 second(s)Memory Limit: 32 MB

Given the value of a+b and ab you will have to find the value of an+bna and b not necessarily have to be real numbers.

Input

Input starts with an integer T (≤ 10000), denoting the number of test cases.

Each case contains three non-negative integers, p, q and n. Here p denotes the value of a+b and q denotes the value of ab. Each number in the input file fits in a signed 32-bit integer. There will be no such input so that you have to find the value of 00.

Output

For each test case, print the case number and (an+bn) modulo 264.

Sample Input

Output for Sample Input

2

10 16 2

7 12 3

Case 1: 68

Case 2: 91

 

题意:

给你p=a+b, q=ab

算出 (a^n+b^)mod2^64

做法:

mod 2^64所以开 unsigned long long ,llu 就行了,达到上限会自动取模的。

然后就是公式了。我是在推公式中找到的规律。

a^2+b^2=(a+b)*(a+b)-2*a*b

a^3+b^3=(a^2+b^2)*(a+b)-a*b(a+b)

a^4+b^4=(a^3+b^3)*(a+b)-a*b(a^2+b^2)

设G(n)=a^n+b^n

G(n)=G(n-1)*p-G(G-2)*q

然后就是快速幂了。.

#include<stdio.h>#include<string.h>#define Matr 5 //矩阵大小,注意能小就小   矩阵从1开始   所以Matr 要+1   最大可以100#define ll unsigned long longstruct mat//矩阵结构体,a表示内容,size大小 矩阵从1开始   但size不用加一{    ll a[Matr][Matr];    mat()//构造函数    {        memset(a,0,sizeof(a));    }};int Size=  2; mat multi(mat m1,mat m2)//两个相等矩阵的乘法,对于稀疏矩阵,有0处不用运算的优化 {    mat ans=mat();     for(int i=1;i<=Size;i++)        for(int j=1;j<=Size;j++)            if(m1.a[i][j])//稀疏矩阵优化                 for(int k=1;k<=Size;k++)                    ans.a[i][k]=(ans.a[i][k]+m1.a[i][j]*m2.a[j][k]); //i行k列第j项    return ans;}mat quickmulti(mat m,ll n)//二分快速幂 {    mat ans=mat();    int i;    for(i=1;i<=Size;i++)ans.a[i][i]=1;    while(n)    {        if(n&1)ans=multi(m,ans);//奇乘偶子乘 挺好记的.        m=multi(m,m);        n>>=1;    }    return ans;}void print(mat m)//输出矩阵信息,debug用   {      int i,j;      printf("%d\n",Size);      for(i=1;i<=Size;i++)      {          for(j=1;j<=Size;j++)printf("%llu ",m.a[i][j]);          printf("\n");      }  }  int main(){  /*ll a,b;while(scanf("%llu",&a)!=EOF)printf("%llu\n",-a+18446744073709551615+1);*/int t;int cas=1;scanf("%d",&t);while(t--){ll p,q,n;int p1,q1;scanf("%lld%lld%llu",&p,&q,&n);// p a+b q ab ll tem=18446744073709551615-q+1;mat gouzao=mat(),chu=mat();//构造矩阵  初始矩阵   chu.a[1][1]=p;chu.a[1][2]=p*p+2*tem;chu.a[1][3]=q;printf("Case %d: ",cas++);if(n==0)printf("2\n");else if(n==1)printf("%llu\n",p);else if(n==2)printf("%llu\n",p*p+2*tem);else{ gouzao.a[1][1]=0;gouzao.a[2][1]=1;gouzao.a[1][2]=tem;gouzao.a[2][2]=p;  //print(gouzao);printf("%llu\n",multi(chu,quickmulti(gouzao,n-2)).a[1][2]); } } return 0;}/*ans^=n -mat ans=mat();ans.size=Size;初始化ans矩阵ans=quickmulti(ans,n,mod);void print(mat m)//输出矩阵信息,debug用 {    int i,j;    printf(%dn,m.size);    for(i=1;i=m.size;i++)    {        for(j=1;j=m.size;j++)printf(%d ,m.a[i][j]);        printf(n);    }}*/









0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 熬夜长出的痘痘怎么办 脸上两边长痘痘怎么办 我左脸比右脸大怎么办 左脸莫名肿了怎么办 牙疼得半边脸痛怎么办 手和脸突然发麻怎么办 右半边脸麻木了怎么办 左边脸突然肿了怎么办 左半边脸皮肤疼怎么办 脸内侧的肉肿了怎么办 上火引起的脸肿怎么办 脸肿里面有硬块怎么办 内分泌失调引起的肥胖怎么办 宝宝接种证丢了怎么办 不给补办接种证怎么办 儿童接种证丢了怎么办 疫苗接种本丢了怎么办 脊灰滴剂滴多了怎么办 鞋小了挤脚趾头怎么办 大母脚趾头疼是怎么办 小脚趾内侧长茧怎么办 小脚趾肿了很痛怎么办 穿袜子大脚趾痛怎么办 脚指头长水泡很痒怎么办 走路脚打起泡了怎么办 剪完脚趾甲肿了怎么办 大脚趾关节处疼怎么办 战士10穿不进去怎么办 脚上皮肤干燥起皮怎么办 脚趾头冻了很痒怎么办 大脚趾里面有脓怎么办 大脚趾肉肿了怎么办 大脚趾边上肿了怎么办 大母脚趾关节疼怎么办 大脚趾有点歪了怎么办 大脚趾扭伤肿了怎么办 大脚趾外翻怎么办 知乎 颈椎带着胳膊疼怎么办 胳膊酸困无力是怎么办 腰疼引起的腿麻怎么办 手臂到手指麻痛怎么办