zoukankan      html  css  js  c++  java
  • Contemplation! Algebra(矩阵快速幂,uva10655)

    Problem E
    Contemplation! Algebra
    Input: Standard Input

    Output: Standard Output

    Time Limit: 1 Second

    Given the value of a+b and ab you will have to find the value of an+bn

    Input

    The input file contains several lines of inputs. Each line except the last line contains 3 non-negative integers pq and n. Here p denotes the value of a+b andq denotes the value of ab. Input is terminated by a line containing only two zeroes. This line should not be processed. 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 line of input except the last one produce one line of output. This line contains the value of an+bn.  You can always assume that an+bfits in a signed 64-bit integer.

                Sample Input                                                                               Output for Sample Input

    10 16 2 
    7 12 3 
    0 0

    68

    91 

      

     

    题意:已知p=a+b;q=a*b;求a^n+b^n=ans? 注意a,b是实数哦!还有题目说不用考虑0^0这种情况!

    那么分析一下:n = 0 ,  ans= 2 ;

           n = 1 ,  ans= a + b = p ;

           n = 2 ,  ans= p * p - 2 * q = ans1 * p - ans0 * q;

      同理   n = 3 ,  ans= ans2 * p - ans1 * q;    

           n = 4 ,       .......

           ..................

           所以矩阵为

     

        p

        1

       -q

        0

     

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1596

    转载请注明出处:寻找&星空の孩子

     

    对了这个题还有一点比较坑爹;就是最后那组测试数据。。。不解释我错了5次。。。

    #include<cstring>//用c++的输入就过了。
    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    #define LL long long
    
    struct matrix
    {
        LL mat[2][2];
    };
    
    
    
    matrix multiply(matrix a,matrix b)
    {
        matrix c;
        memset(c.mat,0,sizeof(c.mat));
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<2;j++)
            {
                if(a.mat[i][j]==0)continue;
                for(int k=0;k<2;k++)
                {
                    if(b.mat[j][k]==0)continue;
                    c.mat[i][k]+=a.mat[i][j]*b.mat[j][k];
                }
            }
        }
        return c;
    }
    
    matrix quickmod(matrix a,LL m)
    {
        matrix res;
        for(int i=0;i<2;i++)
            for(int j=0;j<2;j++)
                res.mat[i][j]=(i==j);
        while(m)
        {
            if(m&1) res=multiply(res,a);
            m>>=1;
            a=multiply(a,a);
        }
        return res;
    }
    
    int main()
    {
        LL p,q,n;
     //   while(scanf("%lld%lld%lld",&p,&q,&n),p+q+n)
        while(cin>>p>>q>>n)
        {
      //      if(!n&&(!p||!q)) break;
    
     //       scanf("%lld",&n);
            if(n==0)printf("2
    ");//cout<<2<<endl;//
            else if(n==1)printf("%lld
    ",p);// cout<<p<<endl;//
            else if(n==2) printf("%lld
    ",p*p-2*q);//cout<<p*p-2*q<<endl;//
            else
            {
                //初始矩阵(p*p-2*q,p)
                matrix ans;
                ans.mat[0][0]=p;
                ans.mat[0][1]=1;
                ans.mat[1][0]=-q;
                ans.mat[1][1]=0;
    
                ans=quickmod(ans,n-1);
                LL ant=p*ans.mat[0][0]+2*ans.mat[1][0];
     //           cout<<ant<<endl;
                printf("%lld
    ",ant);
    //            printf("%lld
    ",(p*ans.mat[0][0]+2*ans.mat[1][0]));
            }
        }
        return 0;
    }

    加油,少年!!!

     

     

     

  • 相关阅读:
    做到就得到,人生成功的启示
    这个世界没什么过不去的事情,记我的经历
    要想富,先读书,没有文化要吃一辈子的亏
    git学习笔记11-git多人协作-实际多人怎么开发
    git学习笔记10-新开发的功能不想要了-强行删除分支
    git学习笔记09-bug分支-自己的分支改到一半了-要去改bug怎么办?
    git学习笔记08-分支管理策略-实际上我们应该怎么应用分支
    git学习笔记07-冲突了怎么办-那就解决冲突呗
    git学习笔记06-创建分支合并分支-比svn快多了,因为只有指针在改变
    git学习笔记05-从远程库克隆
  • 原文地址:https://www.cnblogs.com/yuyixingkong/p/4339863.html
Copyright © 2011-2022 走看看