zoukankan      html  css  js  c++  java
  • 233 Matrix(矩阵快速幂+思维)

    In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be 233, 2333, 23333... (it means a 0,1 = 233,a 0,2 = 2333,a 0,3 = 23333...) Besides, in 233 matrix, we got ai,j = a i-1,j +a i,j-1( i,j ≠ 0). Now you have known a 1,0,a 2,0,...,a n,0, could you tell me a n,m in the 233 matrix?

    Input

    There are multiple test cases. Please process till EOF. 

    For each case, the first line contains two postive integers n,m(n ≤ 10,m ≤ 10 9). The second line contains n integers, a 1,0,a 2,0,...,a n,0(0 ≤ a i,0 < 2 31).

    Output

    For each case, output a n,m mod 10000007.

    Sample Input

    1 1
    1
    2 2
    0 0
    3 7
    23 47 16

    Sample Output

    234
    2799
    72937

    这个题的难点在于如何去构造矩阵,我们一般的构造矩阵是一维递推式,这个我们也可以通过改变一下就我们让第一行为23,最后一行为3,然后根据递推关系判断

    如图:

    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<map>
    #include<set>
    #include<vector>
    #include<cmath>
    const long long mod=10000007;
    
    const int maxn=1e5+5;
    typedef long long ll;
    using namespace std;
    int n,m;
    struct mat
    {
    	ll a[15][15];
    };
    
    mat Mul(mat a,mat b)
    {
    	mat ans;
    	memset(ans.a,0,sizeof(ans.a));
    	for(int t=0;t<=n+1;t++)
    	{
    		for(int j=0;j<=n+1;j++)
    		{
    			for(int k=0;k<=n+1;k++)
    			{
    				ans.a[t][j]=(ans.a[t][j]+a.a[t][k]*b.a[k][j])%mod;
    			}
    		}
    	}
    	return ans;
    }
    mat anss;
    ll quickPow(int k)
    {
    	mat res;
    	memset(res.a,0,sizeof(res.a));
    	for(int t=0;t<=n;t++)
    	{
    		res.a[t][0]=10;
    	}
    	for(int t=0;t<=n;t++)
    	{
    		for(int j=1;j<=t;j++)
    		{
    		   res.a[t][j]=1;
    		}
    		res.a[t][n+1]=1;
    	}
    	for(int t=0;t<=n;t++)
    	{
    		res.a[n+1][t]=0;
    	}
    	res.a[n+1][n+1]=1;
    	while(k)
    	{
    	  	if(k&1)
    	  	{
    	  	 anss=Mul(res,anss);
    	  	}
    	  	res=Mul(res,res);
    	  	k>>=1;
    	}
    
    	return anss.a[n][0]%mod;
    }
    
    int  main()
    {
    	
    
    	while(cin>>n>>m)
    	{
    	   memset(anss.a,0,sizeof(anss.a));
    	   anss.a[0][0]=23;
    	   for(int t=1;t<=n;t++)
    	   {
    	   	scanf("%lld",&anss.a[t][0]);
    	   }
    	   anss.a[n+1][0]=3;
    	   cout<<quickPow(m)<<endl;
    	   
    	   
    	}
    	return 0;
    }
    
  • 相关阅读:
    截取图片组件
    node之mongodb的DAO
    模块化开发插件,组件
    tweenMax实体抛物线
    defineProperties属性的运用==数据绑定
    程序概述
    JavaBase
    [luogu 1092] 虫食算 (暴力搜索剪枝)
    [luogu1073 Noip2009] 最优贸易 (dp || SPFA+分层图)
    [51Nod 1218] 最长递增子序列 V2 (LIS)
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781747.html
Copyright © 2011-2022 走看看