fork(2) download
  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define mp make_pair
  4. #define F first
  5. #define S second
  6. #define oioi printf("oioi\n")
  7. #define eoq cout << "eoq" << '\n'
  8. #define CLS while (getchar () != '\n')
  9. using namespace std;
  10. typedef long long int ll;
  11. typedef unsigned long long int llu;
  12. typedef pair<double, double> dd;
  13. typedef vector<ll> vi;
  14. const int dx[] = { 0, 1, -1, 0, 1, -1, -1, 1};
  15. const int dy[] = {-1, 0, 0, 1, 1, 1, -1, -1};
  16. const ll MOD = 1300031;
  17. const ll INF = 100000000LL;
  18. const ll LLINF = 1e18 + 10;
  19. #define MAXN 200010
  20.  
  21. struct pv{ // pv porque eh uma struct pra ponto e vetor.
  22.  
  23. double x, y;
  24. pv(){x=y=0.0;}
  25. pv(double a, double b) : x(a), y(b) {}
  26.  
  27. pv operator - (pv g){ // subtrai dois pontos A e B criando o vetor AB
  28.  
  29. return pv(x-g.x, y-g.y);
  30. }
  31.  
  32.  
  33. pv operator + (pv u){ // anda com o ponto no vetor u
  34.  
  35. return pv(x+u.x, y+u.y);
  36. }
  37.  
  38.  
  39. pv operator * (double k){ //multiplicacao do vetor por um escalar k
  40. return pv(x*k, y*k);
  41. }
  42.  
  43.  
  44. bool operator < (pv g) const{ //operator < pra pontos. Necessario pra ordenar ocm a funcao sort
  45. if(g.x != x) return x < g.x;
  46. return y < g.y;
  47. }
  48.  
  49. };
  50.  
  51.  
  52. double dot(pv a, pv b){//produto escalar (dot product)
  53. // a e b sao vetores
  54. return a.x*b.x + a.y*b.y;// se a e b sao o mesmo vetor, o resultado vai ser a norma de a ao quadrado: |a|^2
  55. }
  56.  
  57. double cross(pv a, pv b){//produto vetorial (cross product)
  58. // a e b sao vetores
  59. return a.x*b.y - a.y*b.x;
  60. }
  61.  
  62. bool ta_dentro(pv au, pv ap){
  63. double c = cross(au, ap);
  64. double ans = (dot(au, ap)*1.0 / dot(au, au));
  65. return c==0 && ans > 0 && ans < 1;
  66. }
  67.  
  68. int N, K;
  69. vector<pair<int, int> > v;
  70.  
  71. struct mat{
  72. ll v[226][226];
  73. mat(){
  74. memset(v, 0, sizeof v);
  75. }
  76. mat operator * (mat other){
  77. mat ans;
  78. for (int i = 0; i < N*N; i++)
  79. {
  80. for (int j = 0; j < N*N; j++)
  81. {
  82. for (int k = 0; k < N*N; k++)
  83. {
  84. ans.v[i][j] += (v[i][k] * other.v[k][j]);
  85. if(ans.v[i][j] > INF) ans.v[i][j] %= MOD;
  86. }
  87. }
  88. }
  89. return ans;
  90. }
  91. };
  92.  
  93. mat base, ret;
  94.  
  95. mat exponencia(int exp){
  96. if(exp==0) return ret;
  97. mat aux = exponencia(exp/2);
  98. aux = aux*aux;
  99. if(exp%2) aux = aux*base;
  100. return aux;
  101. }
  102.  
  103. int main(){
  104. pv a, b, c;
  105. pv ab, ac;
  106.  
  107. //~ a = pv(4, 4);
  108. //~ b = pv();
  109. //~ c = pv();
  110.  
  111. //~ ab = b-a;
  112. //~ ac = c-a;
  113.  
  114.  
  115.  
  116. //~ if(ta_dentro(ab, ac)) cout << "dentro\n";
  117. //~ else cout << "fora\n";
  118.  
  119. for (int i = 0; i < 226; i++)
  120. {
  121. ret.v[i][i] = 1;
  122.  
  123. }
  124.  
  125. ios_base::sync_with_stdio (0);
  126. cin.tie (0);
  127.  
  128. while (cin >> N >> K, N!=0)
  129. {
  130. v.clear();
  131. for (int i = 0; i < N; i++)
  132. {
  133. for (int j = 0; j < N; j++)
  134. {
  135. int x = j;
  136. int y = N-i-1;
  137. v.pb(mp(x, y));
  138. }
  139. }
  140.  
  141. //~ for (int i = 0; i < v.size(); i++)
  142. //~ {
  143. //~ cout << v[i].F << " " << v[i].S << endl;
  144. //~ }
  145.  
  146. base = mat();
  147. bool erro;
  148. for (int i = 0; i < v.size(); i++)
  149. {
  150. for (int j = i+1; j < v.size(); j++)
  151. {
  152. erro=false;
  153. for (int k = 0; k < v.size(); k++)
  154. {
  155. //~ if(k==i || k==j) continue;
  156. a = pv(v[i].F, v[i].S);
  157. b = pv(v[j].F, v[j].S);
  158. c = pv(v[k].F, v[k].S);
  159. ab = b-a;
  160. ac = c-a;
  161. if(ta_dentro(ab, ac)){
  162. erro=true;
  163. break;
  164. }
  165. }
  166. if(!erro) base.v[i][j] = base.v[j][i] = 1;
  167. }
  168. }
  169.  
  170. mat ans = exponencia(K-1);
  171. ll sum = 0LL;
  172. for (int i = 0; i < N*N; i++)
  173. {
  174. for (int j = 0; j < N*N; j++)
  175. {
  176. sum += ans.v[i][j];
  177. if(sum>INF) sum%=MOD;
  178. }
  179. }
  180. cout << sum%MOD << "\n";
  181.  
  182. }
  183.  
  184.  
  185. return 0;
  186. }
  187.  
Success #stdin #stdout 0.11s 32480KB
stdin
8 1
8 2
8 3
8 4
8 5
8 6
8 7
8 8
8 9
8 10
8 11
8 12000
0 0
stdout
64
2564
102828
223491
260435
1293300
535016
239886
1299891
898113
998654
1208910