2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Coin

来源:互联网 发布:jquery高级编程 微盘 编辑:程序博客网 时间:2024/05/04 00:22

题意:

询问硬币K次,正面朝上次数为偶数。

思路:

矩阵优化了下。dp[i][0] = 下* dp[i-1][0] + 上*dp[i-1][1] (满足条件的)

dp[i][1]= 上*dp[i-1][0] + 下*dp[i-1][1] (不满足条件的)

#include <iostream>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <queue>#include <algorithm>using namespace std;typedef long long ll;const int maxn=3;struct Matrix//????{  ll a[maxn][maxn];  void init()            {    memset(a,0,sizeof(a));    for(int i=1;i<maxn;i++)      a[i][i]=1;  }}  ;const ll mod=1000000007;Matrix mul(Matrix a,Matrix b)  //(a*b)%mod  ????{  Matrix ans;  memset(ans.a,0,sizeof(ans.a));  for(int i=1;i<maxn;i++)    for(int j=1;j<maxn;j++)    {      ans.a[i][j]=0;      for(int k=1;k<maxn;k++)        {            ans.a[i][j]+=a.a[i][k]*b.a[k][j] ;            ans.a[i][j]%=mod;        }    }    return ans;}Matrix pow(Matrix a,ll m){    Matrix res ;    memset(res.a,0,sizeof(res.a));    for(int i=1;i<maxn;i++)    {        res.a[i][i]=1;    }    while(m)    {        if(m&1)        {            res=mul(a,res);        }        a=mul(a,a);        m/=2;    }    return res;}ll quick(ll n,ll m){    ll ans = 1;    while(m){        if(m & 1)            ans = ans * n % mod;        m >>= 1;        n = n * n % mod;    }    return ans;}int main(){    double p;    int t=0;    int n;    scanf("%d",&t);    while(t--)    {        ll p,q,k;        scanf("%lld%lld%lld",&p,&q,&k);        ll nums=    q*quick(p,mod-2)%mod;        ll numx=(p-q)*quick(p,mod-2)%mod;        Matrix ans;        ans.a[1][1]=(numx)%mod;        ans.a[2][1]=(nums)%mod;      //  printf("%lld\n",quick(27,mod-2)%mod*14%mod);      /*  ll pp = (numx * numx % mod + nums * nums % mod) % mod;        ll qq = (numx * numx) % mod;        printf("%lld\n",(pp * numx % mod + qq * nums % mod) % mod);*/        if(k==1)        {            printf("%lld\n",ans.a[1][1]%mod);            continue;        }        Matrix base,res;        base.a[1][1]=numx,base.a[1][2] =nums;        base.a[2][1]=nums,base.a[2][2]= numx;        res=pow( base, k - 1 );        ans=mul( base,res);        printf("%lld\n",ans.a[1][1]%mod);    }}


阅读全文
0 0