2014西安网络赛1009||hdu5015 矩阵
2014-09-15 09:15
453 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5015
Problem Description
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
a0,1 = 233,a0,2 = 2333,a0,3 = 23333...) Besides, in 233 matrix, we got ai,j = ai-1,j +ai,j-1( i,j ≠ 0). Now you have known a1,0,a2,0,...,an,0, could you tell
me an,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 ≤ 109). The second line contains n integers, a1,0,a2,0,...,an,0(0 ≤ ai,0 < 231).
Output
For each case, output an,m mod 10000007.
Sample Input
1 1
1
2 2
0 0
3 7
23 47 16
Sample Output
234
2799
72937
Hint
解题思路:这题关键是矩阵的构造,比赛时是队友推出的公式,代码实现如下,细节读者品味,我就不罗嗦了。。。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int N=10005;
const int MOD=10000007;
int n;
LL m,a[20];
struct Matrix
{
LL m[15][15];
};
Matrix I;
Matrix mult(Matrix a,Matrix b)
{
Matrix c;
for(int i=0;i<n+2;i++)
for(int j=0;j<n+2;j++)
{
c.m[i][j]=0;
for(int k=0;k<n+2;k++)
c.m[i][j]+=(a.m[i][k]*b.m[k][j])%MOD;
c.m[i][j]%=MOD;
}
return c;
}
Matrix quick_mod(Matrix a,LL n)
{
Matrix c=I;
while(n)
{
if(n&1)
c=mult(c,a);
n>>=1;
a=mult(a,a);
}
return c;
}
int main()
{
while(~scanf("%d%I64d",&n,&m))
{
a[0]=3;
a[1]=23;
for(int i=2;i<n+2;i++)
scanf("%I64d",&a[i]);
for(int i=0;i<n+2;i++)
for(int j=0;j<n+2;j++)
if(i==j)
I.m[i][j]=1;
else
I.m[i][j]=0;
/* for(int i=0;i<n+2;i++)
{
for(int j=0;j<n+2;j++)
printf("%I64d ",I.m[i][j]);
printf("\n");
}*/
Matrix A;
for(int i=0;i<n+2;i++)
for(int j=0;j<n+2;j++)
if(i>=j)
A.m[i][j]=1;
else
A.m[i][j]=0;
for(int i=1;i<n+2;i++)
A.m[i][1]=10;
LL ans=0;
Matrix B=quick_mod(A,m);
/*for(int i=0;i<n+2;i++)
{
for(int j=0;j<n+2;j++)
printf("%I64d ",B.m[i][j]);
printf("\n");
}*/
for(int i=0;i<n+2;i++)
ans=(ans+B.m[n+1][i]*a[i]%MOD)%MOD;
printf("%I64d\n",ans);
}
return 0;
}
Problem Description
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
a0,1 = 233,a0,2 = 2333,a0,3 = 23333...) Besides, in 233 matrix, we got ai,j = ai-1,j +ai,j-1( i,j ≠ 0). Now you have known a1,0,a2,0,...,an,0, could you tell
me an,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 ≤ 109). The second line contains n integers, a1,0,a2,0,...,an,0(0 ≤ ai,0 < 231).
Output
For each case, output an,m mod 10000007.
Sample Input
1 1
1
2 2
0 0
3 7
23 47 16
Sample Output
234
2799
72937
Hint
解题思路:这题关键是矩阵的构造,比赛时是队友推出的公式,代码实现如下,细节读者品味,我就不罗嗦了。。。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int N=10005;
const int MOD=10000007;
int n;
LL m,a[20];
struct Matrix
{
LL m[15][15];
};
Matrix I;
Matrix mult(Matrix a,Matrix b)
{
Matrix c;
for(int i=0;i<n+2;i++)
for(int j=0;j<n+2;j++)
{
c.m[i][j]=0;
for(int k=0;k<n+2;k++)
c.m[i][j]+=(a.m[i][k]*b.m[k][j])%MOD;
c.m[i][j]%=MOD;
}
return c;
}
Matrix quick_mod(Matrix a,LL n)
{
Matrix c=I;
while(n)
{
if(n&1)
c=mult(c,a);
n>>=1;
a=mult(a,a);
}
return c;
}
int main()
{
while(~scanf("%d%I64d",&n,&m))
{
a[0]=3;
a[1]=23;
for(int i=2;i<n+2;i++)
scanf("%I64d",&a[i]);
for(int i=0;i<n+2;i++)
for(int j=0;j<n+2;j++)
if(i==j)
I.m[i][j]=1;
else
I.m[i][j]=0;
/* for(int i=0;i<n+2;i++)
{
for(int j=0;j<n+2;j++)
printf("%I64d ",I.m[i][j]);
printf("\n");
}*/
Matrix A;
for(int i=0;i<n+2;i++)
for(int j=0;j<n+2;j++)
if(i>=j)
A.m[i][j]=1;
else
A.m[i][j]=0;
for(int i=1;i<n+2;i++)
A.m[i][1]=10;
LL ans=0;
Matrix B=quick_mod(A,m);
/*for(int i=0;i<n+2;i++)
{
for(int j=0;j<n+2;j++)
printf("%I64d ",B.m[i][j]);
printf("\n");
}*/
for(int i=0;i<n+2;i++)
ans=(ans+B.m[n+1][i]*a[i]%MOD)%MOD;
printf("%I64d\n",ans);
}
return 0;
}
相关文章推荐
- 2014西安网络预选赛1009(点分治)HDU5016
- 2014西安网络预选赛1009(矩阵快速幂)hdu5015
- 2014西安网络预选赛1003(DP+剪枝)hdu5009
- HDU5007-Post Robot-2014西安网络赛(字符串水题)
- 2014西安赛区网络赛 5014 Number Sequence
- 2014西安网络赛1008||hdu5014 二进制
- 2014 ACM/ICPC 西安赛区网络赛解题报告汇总
- hdu 5012 2014西安网络赛
- hdu 5015 233 Matrix(西安网络赛1009)【构造矩阵】
- hdu 2014西安赛区网络赛 5011Game
- HDOJ 5012 Dice--2014网络赛西安赛区F题
- hdu 5015 233 Matrix(西安网络赛 1009)
- 后缀数组(2014西安网络赛)hdu5008
- 2014西安网络预选赛1002(后缀数组求第K大的子串)hdu5008
- 2014网络赛 西安赛区
- 矩阵快速幂(2014西安网络赛)+hdu5015
- hdu5008 Boring String Problem,2014西安网络赛B题,后缀数组,RMQ
- 2014 西安赛区网络赛 5012Dice
- HDOJ 5007 Post Robot--2014网络赛西安赛区A题
- [2014 西安网络赛]