2017广西邀请赛 Covering(矩阵快速幂)
2017-08-31 17:10
337 查看
题意:给你4*n的矩形,用1*2的方格铺满。
题解:经典问题,我们可以先用公式找出前几项,然后求递推式即可,但是n很大,所以要快速幂搞搞。
我们可以由前几项推得递推公式为:f[i]=f[i-1]+5*f[i-2]+f[i-3]-f[i-4];
因此我们可以构造矩阵为:
1 5 1 -1
1 0 0 0
0 1 0 0
0 0 1 0 然后矩阵快速幂求解就好啦。
附带公式代码:
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<functional>
using namespace std;
typedef long long ll;
#define inf 1000000000
#define mod 1000000007
#define maxn 2600005
#define PI acos(-1.0)
#define lowbit(x) (x&-x)
#define eps 1e-9
struct node
{
ll a[5][5];
}a, b;
int main(void)
{
double n, m, i, j, sum;
while (scanf("%lf", &m) != EOF)
{
sum = 1;n = 4;
for (i = 1;i <= (m + 1) / 2;i++)
for (j = 1;j <= (n + 1) / 2;j++)
sum *= 4 * cos(PI*i / (m + 1))*cos(PI*i / (m + 1)) + 4 * cos(PI*j / (n + 1)) * cos(PI*j / (n + 1));
printf("%.0f\n", sum);
}
return 0;
}
AC代码:
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<functional>
using namespace std;
typedef long long ll;
#define inf 1000000000
#define mod 1000000007
#define maxn 2600005
#define PI acos(-1.0)
#define lowbit(x) (x&-x)
#define eps 1e-9
struct node
{
ll a[5][5];
}a, b;
ll c[10];
void init()
{
int i, j;
c[1] = 1;c[2] = 5;
c[3] = 11;c[4] = 36;
b.a[1][1] = 1;b.a[1][2] = 5;b.a[1][3] = 1;b.a[1][4] = -1;
for (i = 2;i <= 4;i++)
{
for (j = 1;j <= 4;j++)
{
if (i - j == 1)
b.a[i][j] = 1;
else
b.a[i][j] = 0;
}
}
}
node qq(node a, node b)
{
node c;
int i, j, k;
for (i = 1;i <= 4;i++)
for (j = 1;j <= 4;j++)
{
c.a[i][j] = 0;
for (k = 1;k <= 4;k++)
{
a.a[i][k] %= mod;
b.a[k][j] %= mod;
c.a[i][j] += a.a[i][k] * b.a[k][j];
c.a[i][j] %= mod;
}
}
return c;
}
node q(node a, ll y)
{
node tmp;
int i, j;
for (i = 1;i <= 4;i++)
for (j = 1;j <= 4;j++)
{
if (i == j)
tmp.a[i][j] = 1;
else
tmp.a[i][j] = 0;
}
while (y)
{
if (y % 2)
tmp = qq(tmp, a);
a = qq(a, a);
y /= 2;
}
return tmp;
}
int main(void)
{
init();
ll n, i, j, ans;
while (scanf("%lld", &n) != EOF)
{
ans = 0;
if (n <= 4)
{
printf("%lld\n", c
);
continue;
}
a = q(b, n - 4);
for (i = 1;i <= 4;i++)
{
a.a[1][4 - i + 1] %= mod;
ans += c[i] * a.a[1][4 - i + 1];
ans %= mod;
while (ans < 0)
ans += mod;
}
printf("%lld\n", ans);
}
return 0;
}
相关文章推荐
- HDU 6185 && 2017广西邀请赛:Covering(矩阵快速幂)
- HDU 6185 Covering (2017 广西邀请赛重现赛)(矩阵快速幂)
- HDU-6185-Covering(广西邀请赛D题)(矩阵快速幂)
- hdu Covering 2017广西邀请赛 矩阵快速幂
- 2017 ACM/ICPC 广西邀请赛||HDU 6185 Covering 【状压DP+矩阵快速幂】
- 2017 ICPC 广西邀请赛1004 Covering
- 【2017广西邀请赛】hdu 6185 Covering 矩阵快速幂
- 2017广西邀请赛 D题Covering (递推+矩阵快速幂)
- ICPC2017南宁邀请赛1005&&HDU6185 (矩阵快速幂/黑科技
- 2017ACM/ICPC广西邀请赛 Duizi and Shunzi
- HDU 6186 && 2017广西邀请赛:CS Course
- HDU6186 | 2017广西邀请赛 CS Course (前缀和后缀)
- 2017 Wuhan University Programming Contest 现场赛 I. A simple math problem(矩阵快速幂)
- 【2017广西邀请赛】hdu 6184 Counting Stars 三元环+set
- 2017网易实习生笔试-矩阵n次方快速求解算法(平方指数法 exponentiation by squaring)
- 矩阵快速幂: 网易2017实习生编程题 魔力手环
- 2017 Wuhan University Programming Contest (Online Round) E. Lost in WHU(矩阵快速幂)
- 2017广西邀请赛 Duizi and Shunzi(贪心+DP)
- loj#2325. 「清华集训 2017」小 Y 和恐怖的奴隶主 (矩阵快速幂优化概率dp)
- 2017 Wuhan University Programming Contest 现场赛 I. A simple math problem(矩阵快速幂)