zoukankan      html  css  js  c++  java
  • lightoj 1052

    思路:很容易发现规律,数列和Fib数列一样的。

    记开始的时候啊a的个数为Y,b的个数为X。建立矩阵。

    代码如下:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #define M 105
     7 #define eps 1e-6
     8 #define ll long long
     9 #define mod 1000000007
    10 using namespace std;
    11 struct mat
    12 {
    13     ll m[2][2];
    14 };
    15 mat Mul(mat a,mat b)
    16 {
    17     mat ans;
    18     for(int i=0;i<2;i++)
    19     for(int j=0;j<2;j++){
    20         ans.m[i][j]=0;
    21         for(int k=0;k<2;k++)
    22             ans.m[i][j]+=a.m[i][k]*b.m[k][j];
    23         ans.m[i][j]%=mod;
    24     }
    25     return ans;
    26 }
    27 mat Pow(int n)
    28 {
    29     mat ans,a;
    30     for(int i=0;i<2;i++)
    31     for(int j=0;j<2;j++){
    32         ans.m[i][j]=(i==j);
    33         a.m[i][j]=1;
    34     }
    35     a.m[0][0]=0;
    36     while(n){
    37         if(n&1) ans=Mul(ans,a);
    38         n>>=1;
    39         a=Mul(a,a);
    40     }
    41     return ans;
    42 }
    43 ll x,y,X,Y;
    44 bool solve(int n,int m)
    45 {
    46     mat a,b,c;
    47     ll a1,a2,b1,b2;
    48     if(n!=1){
    49         a=Pow(n-1);
    50         a1=a.m[0][0]+a.m[1][0];
    51         a2=a.m[0][1]+a.m[1][1];
    52     }
    53     else a1=a2=1;
    54     if(m!=1){
    55         b=Pow(m-1);
    56         b1=b.m[0][0]+b.m[1][0];
    57         b2=b.m[0][1]+b.m[1][1];
    58     }
    59     else b1=b2=1;
    60     ll t1=x*b1-y*a1;
    61     ll t3=a2*y-x*b2;
    62     ll t2=b1*a2-b2*a1;
    63     if(t3%t2!=0||t1%t2!=0) return 0;
    64     X=t1/t2;
    65     Y=t3/t2;
    66     if(X<0||Y<0) return 0;
    67     return 1;
    68 }
    69 int main()
    70 {
    71     int t,ca=0,n,m,k;
    72     scanf("%d",&t);
    73     while(t--){
    74         scanf("%d%lld%d%lld%d",&n,&x,&m,&y,&k);
    75         printf("Case %d: ",++ca);
    76         if(!solve(n,m)) printf("Impossible
    ");
    77         else{
    78             if(k==1){
    79                 printf("%lld
    ",(X+Y)%mod);
    80                 continue;
    81             }
    82             mat a=Pow(k-1);
    83             ll ans=(a.m[0][0]+a.m[1][0])*Y+(a.m[0][1]+a.m[1][1])*X;
    84             printf("%lld
    ",ans%mod);
    85         }
    86     }
    87     return 0;
    88 }
    View Code
  • 相关阅读:
    python环境的安装 环境变量和系统变量
    git语句(后续补充)
    pycharm的安装配置及思维导图
    python基础知识 01
    C#基础系列——异步编程初探:async和await
    Type.MakeGenericType 方法 (Type[]) 泛型反射
    ZeroFormatter
    intelliJ IDEA相关
    truesky天气系统
    tressfx hair
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3351832.html
Copyright © 2011-2022 走看看