hihocoder offer收割编程练习赛13 D 骑士游历

思路:

矩阵快速幂。

实现:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5
 6 typedef long long ll;
 7 typedef vector<ll> vec;
 8 typedef vector<vec> mat;
 9
10 const ll mod = 1e9 + 7;
11
12 ll n, x, y;
13
14 mat mul(mat & a, mat & b)
15 {
16     mat c(a.size(), vec(b[0].size()));
17     for (int i = 0; i < a.size(); i++)
18     {
19         for (int k = 0; k < b.size(); k++)
20         {
21             for (int j = 0; j < b[0].size(); j++)
22             {
23                 c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % mod;
24             }
25         }
26     }
27     return c;
28 }
29
30 mat pow(mat a, ll n)
31 {
32     mat b(a.size(), vec(a.size()));
33     for (int i = 0; i < a.size(); i++)
34     {
35         b[i][i] = 1;
36     }
37     while (n > 0)
38     {
39         if (n & 1)
40             b = mul(b, a);
41         a = mul(a, a);
42         n >>= 1;
43     }
44     return b;
45 }
46
47 bool check(int x, int y)
48 {
49     int m = x / 8, n = x % 8, p = y / 8, q = y % 8;
50     if (abs(m - p) == 1 && abs(n - q) == 2)
51         return true;
52     if (abs(m - p) == 2 && abs(n - q) == 1)
53         return true;
54     return false;
55 }
56
57 void init(mat & x, mat & y, int p, int q)
58 {
59     for (int i = 0; i < 64; i++)
60     {
61         for (int j = 0; j < 64; j++)
62         {
63             if (check(i, j))
64                 x[i][j] = x[j][i] = 1;
65             else
66                 x[i][j] = x[j][i] = 0;
67         }
68     }
69     for (int i = 0; i < 64; i++)
70     {
71         y[0][i] = 0;
72     }
73     y[0][p * 8 + q] = 1;
74 }
75
76 int main()
77 {
78     cin >> n >> x >> y;
79     x--, y--;
80     mat a(64, vec(64));
81     mat m(1, vec(64));
82     init(a, m, x, y);
83     a = pow(a, n);
84     m = mul(m, a);
85     ll cnt = 0;
86     for (int i = 0; i < 64; i++)
87     {
88         cnt += m[0][i];
89         cnt %= mod;
90     }
91     cout << cnt << endl;
92     return 0;
93 }
时间: 2024-07-30 03:23:43

hihocoder offer收割编程练习赛13 D 骑士游历的相关文章

hihocoder - [Offer收割]编程练习赛17

hihocoder - [Offer收割]编程练习赛17 题目1 : F1 Score 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和他的小伙伴们一起写了很多代码.时间一久有些代码究竟是不是自己写的,小Hi也分辨不出来了. 于是他实现了一个分类算法,希望用机器学习实现自动分类. 为了评价这个分类算法的优劣,他选出了N份有标记的代码作测试集,并决定用F1 Score作为评价标准. 给出N份代码的实际作者是不是小Hi以及分类算法预测的结果,请你计算F1 Sco

hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)

题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x值是多少.这里还要再辅助一个val[k]表示处理到当前情况只错了k次的最小值是多少因为改变的不止是和弦还有初始值,可以看一下代码理解一下. #include <iostream> #include <cstring> #include <cstdio> #include &

hihocoder offer收割编程练习赛12 C 矩形分割

思路: 模拟,深搜. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 using namespace std; 5 6 const int dx[4] = { 0, 1, 0, -1 }; 7 const int dy[4] = { -1, 0, 1, 0 }; 8 9 int n, m, cnt = 0; 10 int a[305][305]; 11 bool vis[305][3

hihocoder offer收割编程练习赛12 D 寻找最大值

思路: 可能数据太水了,随便乱搞就过了. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 typedef long long ll; 6 7 int a[100005], n; 8 9 int main() 10 { 11 int t; 12 cin >> t; 13 while (t--) 14 { 15 ll max

hihocoder offer收割编程练习赛12 A 歌德巴赫猜想

思路: 枚举. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 6 const int MAX_N = 1000005; 7 8 int prime[MAX_N]; 9 bool is_prime[MAX_N + 1]; 10 11 int init(int n) 12 { 13 int p = 0; 14 for (int i =

HiHoCoder [Offer收割]编程练习赛6 C. 图像算子(高斯消元小数版)

传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在图像处理的技术中,经常会用到算子与图像进行卷积运算,从而达到平滑图像或是查找边界的效 果. 假设原图为 H×W 的矩阵 A,算子矩阵为 D×D 的矩阵 Op ,则处理后的矩阵 B 大小为 (H?D+1)×(W?D+1).其中: B[i][j]=∑(A[i?1+dx][j?1+dy]?Op[dx][dy])|(dx=1..D,dy=1..D),1≤i≤H?D+1,1≤j≤W?D+1 给定矩阵 A 和 B ,以及

hihocoder offer收割编程练习赛11 A hiho字符串

思路: 我用的尺取. 注意题目描述为恰好2个'h',1个'i',1个'o'. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 7 const int INF = 0x3f3f3f3f; 8 9 int ch[100005], ci[100005], co[100005]; 10 1

hihocoder offer收割编程练习赛11 B 物品价值

思路: 状态压缩 + dp. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int INF = 0x3f3f3f3f; 8 9 int t, n, m, s; 10 int V[1005], S[1005], dp[1005][(1 << 11) +

hihocoder offer收割编程练习赛11 C 岛屿3

思路: 并查集的应用. 实现: 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 bool a[1005][1005]; 6 int n, x, y; 7 int par[1000005]; 8 int ran[1000005]; 9 int dx[4] = { 1, 0, -1, 0 }; 10 int dy[4] = { 0, 1, 0, -1 }; 11 12 void init(int