您的位置:首页 > 其它

hdu1757(矩阵加速)

2015-08-06 20:22 239 查看
数据量为10^9,直接矩阵加速搞起

#include <cstring>
#include <cstdio>

const int N = 10;
int MOD;
int n;
struct mat
{
int a[N + 10][N + 10];
};

mat mul(mat x, mat y)
{
mat t;
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
t.a[i][j] = 0;
for(int k = 0; k < N; k++)
{
t.a[i][j] += (x.a[i][k] * y.a[k][j]) % MOD;
}
t.a[i][j] %= MOD;
}
}
return t;
}

mat pow(mat x, int b)
{
mat e;
for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
e.a[i][j] = 0;
}
}
for(int i = 0; i < N; i++)
{
e.a[i][i] = 1;
}
while(b)
{
if(b & 1)
{
e = mul(e, x);
}
x = mul(x, x);
b >>= 1;
}
return e;
}

int main(int argc, char const *argv[])
{
mat x;
while(~scanf("%d%d", &n, &MOD))
{
memset(x.a, 0, sizeof(x.a));
for(int i = 0; i < N; i++)
{
scanf("%d", &x.a[0][i]);
}
if(n < 10)
{
printf("%d", n % MOD);
continue;
}
for(int i = 1; i < N; i++)
{
x.a[i][i - 1] = 1;
}
x = pow(x, n - 9);
int ans = 0;
for(int i = 0; i < N; i++)
{
ans += ((9 - i) * x.a[0][i]) % MOD;
}
printf("%d\n", ans % MOD);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: