5fed235c32 2020-09-10 kinaba: #include <iostream> 5fed235c32 2020-09-10 kinaba: #include <sstream> 5fed235c32 2020-09-10 kinaba: #include <iomanip> 5fed235c32 2020-09-10 kinaba: #include <vector> 5fed235c32 2020-09-10 kinaba: #include <string> 5fed235c32 2020-09-10 kinaba: #include <map> 5fed235c32 2020-09-10 kinaba: #include <set> 5fed235c32 2020-09-10 kinaba: #include <algorithm> 5fed235c32 2020-09-10 kinaba: #include <numeric> 5fed235c32 2020-09-10 kinaba: #include <iterator> 5fed235c32 2020-09-10 kinaba: #include <functional> 5fed235c32 2020-09-10 kinaba: #include <complex> 5fed235c32 2020-09-10 kinaba: #include <queue> 5fed235c32 2020-09-10 kinaba: #include <stack> 5fed235c32 2020-09-10 kinaba: #include <cmath> 5fed235c32 2020-09-10 kinaba: #include <cassert> 5fed235c32 2020-09-10 kinaba: #include <tuple> 5fed235c32 2020-09-10 kinaba: using namespace std; 5fed235c32 2020-09-10 kinaba: typedef long long LL; 5fed235c32 2020-09-10 kinaba: typedef complex<double> CMP; 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: static const unsigned MODVAL = 1000000007; 5fed235c32 2020-09-10 kinaba: struct mint 5fed235c32 2020-09-10 kinaba: { 5fed235c32 2020-09-10 kinaba: unsigned val; 5fed235c32 2020-09-10 kinaba: mint() :val(0) {} 5fed235c32 2020-09-10 kinaba: mint(int x) :val(x%MODVAL) {} 5fed235c32 2020-09-10 kinaba: mint(unsigned x) :val(x%MODVAL) {} 5fed235c32 2020-09-10 kinaba: mint(LL x) :val(x%MODVAL) {} 5fed235c32 2020-09-10 kinaba: }; 5fed235c32 2020-09-10 kinaba: mint& operator+=(mint& x, mint y) { return x = x.val + y.val; } 5fed235c32 2020-09-10 kinaba: mint& operator-=(mint& x, mint y) { return x = x.val - y.val + MODVAL; } 5fed235c32 2020-09-10 kinaba: mint& operator*=(mint& x, mint y) { return x = LL(x.val)*y.val; } 5fed235c32 2020-09-10 kinaba: mint operator+(mint x, mint y) { return x += y; } 5fed235c32 2020-09-10 kinaba: mint operator-(mint x, mint y) { return x -= y; } 5fed235c32 2020-09-10 kinaba: mint operator*(mint x, mint y) { return x *= y; } 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: class ShortBugPaths { public: 5fed235c32 2020-09-10 kinaba: int count(int N, vector <int> D, int J) 5fed235c32 2020-09-10 kinaba: { 5fed235c32 2020-09-10 kinaba: if (N <= 200) { 5fed235c32 2020-09-10 kinaba: vector<vector<int>> c(N, vector<int>(N, 1)); 5fed235c32 2020-09-10 kinaba: vector<vector<int>> c2(N, vector<int>(N, 1)); 5fed235c32 2020-09-10 kinaba: for (int _ = 0; _ < J; ++_) { 5fed235c32 2020-09-10 kinaba: for (int y = 0; y < N; ++y) 5fed235c32 2020-09-10 kinaba: for (int x = 0; x < N; ++x) { 5fed235c32 2020-09-10 kinaba: LL sum = 0; 5fed235c32 2020-09-10 kinaba: for (int DD : D) { 5fed235c32 2020-09-10 kinaba: int yy = y - DD, xx = x; 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy<N && 0 <= xx&&xx<N) sum += c[yy][xx]; 5fed235c32 2020-09-10 kinaba: yy++, xx++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy<N && 0 <= xx&&xx<N) sum += c[yy][xx]; 5fed235c32 2020-09-10 kinaba: yy++, xx--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy<N && 0 <= xx&&xx<N) sum += c[yy][xx]; 5fed235c32 2020-09-10 kinaba: yy--, xx--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy<N && 0 <= xx&&xx<N) sum += c[yy][xx]; 5fed235c32 2020-09-10 kinaba: yy--, xx++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: if (DD == 0) 5fed235c32 2020-09-10 kinaba: sum += c[y][x]; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: c2[y][x] = sum % MODVAL; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: c.swap(c2); 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: mint ans = 0; 5fed235c32 2020-09-10 kinaba: for (int y = 0; y < N; ++y) 5fed235c32 2020-09-10 kinaba: for (int x = 0; x < N; ++x) 5fed235c32 2020-09-10 kinaba: ans += c[y][x]; 5fed235c32 2020-09-10 kinaba: return ans.val; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: else { 5fed235c32 2020-09-10 kinaba: vector<vector<int>> c(201, vector<int>(201, 1)); 5fed235c32 2020-09-10 kinaba: vector<vector<int>> c2(201, vector<int>(201, 1)); 5fed235c32 2020-09-10 kinaba: for (int _ = 0; _ < J; ++_) { 5fed235c32 2020-09-10 kinaba: for (int y = 0; y < 101; ++y) 5fed235c32 2020-09-10 kinaba: for (int x = 0; x < 101; ++x) { 5fed235c32 2020-09-10 kinaba: LL sum = 0; 5fed235c32 2020-09-10 kinaba: for (int DD : D) { 5fed235c32 2020-09-10 kinaba: int yy = y - DD, xx = x; 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: if (y == 100 && x == 100) { 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[100][100]; 5fed235c32 2020-09-10 kinaba: yy++, xx++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[100][100]; 5fed235c32 2020-09-10 kinaba: yy++, xx--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[100][100]; 5fed235c32 2020-09-10 kinaba: yy--, xx--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[100][100]; 5fed235c32 2020-09-10 kinaba: yy--, xx++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: else if (y == 100) { 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[100][min(100,xx)]; 5fed235c32 2020-09-10 kinaba: yy++, xx++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[100][min(100, xx)]; 5fed235c32 2020-09-10 kinaba: yy++, xx--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[100][min(100, xx)]; 5fed235c32 2020-09-10 kinaba: yy--, xx--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[100][min(100, xx)]; 5fed235c32 2020-09-10 kinaba: yy--, xx++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: else if (x == 100) { 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[min(100, yy)][100]; 5fed235c32 2020-09-10 kinaba: yy++, xx++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[min(100, yy)][100]; 5fed235c32 2020-09-10 kinaba: yy++, xx--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[min(100, yy)][100]; 5fed235c32 2020-09-10 kinaba: yy--, xx--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[min(100, yy)][100]; 5fed235c32 2020-09-10 kinaba: yy--, xx++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: else { 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[min(100, yy)][min(100, xx)]; 5fed235c32 2020-09-10 kinaba: yy++, xx++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[min(100, yy)][min(100, xx)]; 5fed235c32 2020-09-10 kinaba: yy++, xx--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[min(100, yy)][min(100, xx)]; 5fed235c32 2020-09-10 kinaba: yy--, xx--; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int d = 0; d < DD; ++d) { 5fed235c32 2020-09-10 kinaba: if (0 <= yy&&yy < N && 0 <= xx&&xx < N) sum += c[min(100, yy)][min(100, xx)]; 5fed235c32 2020-09-10 kinaba: yy--, xx++; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: if (DD == 0) 5fed235c32 2020-09-10 kinaba: sum += c[y][x]; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: c2[y][x] = sum % MODVAL; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: for (int y = 0; y < 201; ++y) 5fed235c32 2020-09-10 kinaba: for (int x = 0; x < 201; ++x) 5fed235c32 2020-09-10 kinaba: c2[y][x] = c2[y>100 ? 200-y : y][x>100 ? 200-x : x]; 5fed235c32 2020-09-10 kinaba: c.swap(c2); 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: mint ans = 0; 5fed235c32 2020-09-10 kinaba: for (int y = 0; y < 201; ++y) 5fed235c32 2020-09-10 kinaba: for (int x = 0; x < 201; ++x) 5fed235c32 2020-09-10 kinaba: if (y == 100 && x == 100) 5fed235c32 2020-09-10 kinaba: ans += mint(c[y][x]) * (N - 200) * (N - 200); 5fed235c32 2020-09-10 kinaba: else if (y == 100 || x == 100) 5fed235c32 2020-09-10 kinaba: ans += mint(c[y][x]) * (N - 200); 5fed235c32 2020-09-10 kinaba: else 5fed235c32 2020-09-10 kinaba: ans += c[y][x]; 5fed235c32 2020-09-10 kinaba: return ans.val; 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: }; 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: // BEGIN CUT HERE 5fed235c32 2020-09-10 kinaba: #include <ctime> 5fed235c32 2020-09-10 kinaba: double start_time; string timer() 5fed235c32 2020-09-10 kinaba: { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } 5fed235c32 2020-09-10 kinaba: template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) 5fed235c32 2020-09-10 kinaba: { os << "{ "; 5fed235c32 2020-09-10 kinaba: for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) 5fed235c32 2020-09-10 kinaba: os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } 5fed235c32 2020-09-10 kinaba: void verify_case(const int& Expected, const int& Received) { 5fed235c32 2020-09-10 kinaba: bool ok = (Expected == Received); 5fed235c32 2020-09-10 kinaba: if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; 5fed235c32 2020-09-10 kinaba: cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } 5fed235c32 2020-09-10 kinaba: #define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); 5fed235c32 2020-09-10 kinaba: #define END verify_case(_, ShortBugPaths().count(N, D, J));} 5fed235c32 2020-09-10 kinaba: int main(){ 5fed235c32 2020-09-10 kinaba: 5fed235c32 2020-09-10 kinaba: CASE(0) 5fed235c32 2020-09-10 kinaba: int N = 3; 5fed235c32 2020-09-10 kinaba: int D_[] = {1}; 5fed235c32 2020-09-10 kinaba: vector <int> D(D_, D_+sizeof(D_)/sizeof(*D_)); 5fed235c32 2020-09-10 kinaba: int J = 1; 5fed235c32 2020-09-10 kinaba: int _ = 24; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(1) 5fed235c32 2020-09-10 kinaba: int N = 123456789; 5fed235c32 2020-09-10 kinaba: int D_[] = {0}; 5fed235c32 2020-09-10 kinaba: vector <int> D(D_, D_+sizeof(D_)/sizeof(*D_)); 5fed235c32 2020-09-10 kinaba: int J = 3; 5fed235c32 2020-09-10 kinaba: int _ = 643499475; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(2) 5fed235c32 2020-09-10 kinaba: int N = 5; 5fed235c32 2020-09-10 kinaba: int D_[] = {0, 10, 2}; 5fed235c32 2020-09-10 kinaba: vector <int> D(D_, D_+sizeof(D_)/sizeof(*D_)); 5fed235c32 2020-09-10 kinaba: int J = 4; 5fed235c32 2020-09-10 kinaba: int _ = 38281; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(3) 5fed235c32 2020-09-10 kinaba: int N = 1000; 5fed235c32 2020-09-10 kinaba: int D_[] = {0,1}; 5fed235c32 2020-09-10 kinaba: vector <int> D(D_, D_+sizeof(D_)/sizeof(*D_)); 5fed235c32 2020-09-10 kinaba: int J = 1; 5fed235c32 2020-09-10 kinaba: int _ = 4996000; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(4) 5fed235c32 2020-09-10 kinaba: int N = 47; 5fed235c32 2020-09-10 kinaba: int D_[] = {3}; 5fed235c32 2020-09-10 kinaba: vector <int> D(D_, D_+sizeof(D_)/sizeof(*D_)); 5fed235c32 2020-09-10 kinaba: int J = 6; 5fed235c32 2020-09-10 kinaba: int _ = 195354165; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(5) 5fed235c32 2020-09-10 kinaba: int N = 200; 5fed235c32 2020-09-10 kinaba: int D_[] = { 0,1,2,3,4,5,6,7,8,9,10 }; 5fed235c32 2020-09-10 kinaba: vector <int> D(D_, D_+sizeof(D_)/sizeof(*D_)); 5fed235c32 2020-09-10 kinaba: int J = 10; 5fed235c32 2020-09-10 kinaba: int _ = 316860289; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: CASE(6) 5fed235c32 2020-09-10 kinaba: int N = 1000000000; 5fed235c32 2020-09-10 kinaba: int D_[] = { 0,1,2,3,4,5,6,7,8,9,10 }; 5fed235c32 2020-09-10 kinaba: vector <int> D(D_, D_+sizeof(D_)/sizeof(*D_)); 5fed235c32 2020-09-10 kinaba: int J = 10; 5fed235c32 2020-09-10 kinaba: int _ = -100; 5fed235c32 2020-09-10 kinaba: END 5fed235c32 2020-09-10 kinaba: } 5fed235c32 2020-09-10 kinaba: // END CUT HERE