Wannafly挑战赛17 AB
A 走格子
题目描述
在平面上有n*n大小的正方形,定义正方形左下角坐标是(1,1),右下角坐标是(n,1)
现在A君在左下角,他的初始方向是向右,他要在正方形内走m步
当A君碰到边界或者已经走过的格子时,他便会逆时针转90°继续走,直到走完m步。
现在给你两个整数n和m,请算出走完m步后A君的坐标。
输入描述:
输入一行两个整数n和m。
输出描述:
输出一行两个数表示A君的坐标。
备注:
n<=1000,m<n*n
模拟题。
1 #include <bits/stdc++.h> 2 using namespace std; 3 bool vis[1010][1010]; 4 int main() { 5 int n, m; 6 cin >> n >> m; 7 int x = 1, y = 1; 8 vis[x][y] = 1; 9 while(m) { 10 while(x+1 <= n && !vis[x+1][y] && m) { 11 vis[++x][y] = 1; 12 m--; 13 } 14 while(y+1 <= n && !vis[x][y+1] && m) { 15 vis[x][++y] = 1; 16 m--; 17 } 18 while(x-1 >= 1 && !vis[x-1][y] && m) { 19 vis[--x][y] = 1; 20 m--; 21 } 22 while(y-1 >=1 && !vis[x][y-1] && m) { 23 vis[x][--y] = 1; 24 m--; 25 } 26 } 27 cout << x << ' ' << y << endl; 28 return 0; 29 }
B 求值2
题目描述
Ans = 0;C(i,v)为组合数第i行第v列的数。
For(inti = 1; i <= n; i++)
For(int v = 0; v <= n; v++)
Ans = (Ans + C(i, v) * C(i, v)) % 998244353;
给你上面的代码中的n,请你输出Ans的值。
输入描述:
输入一个整数n
输出描述:
输出Ans的值。
备注:
n<=106
数学题,求for(i:n) C(i*2,i)。
1 //for i:n : C(i*2,i) 2 #include <bits/stdc++.h> 3 #define ll long long 4 using namespace std; 5 const int mod = 998244353; 6 const int N = 2e6+10; 7 ll a[N], b[N]; 8 ll n, ans = 0; 9 ll pow_mod(ll x, ll n) { 10 ll y = 1; 11 while(n) { 12 if(n&1) y = y*x%mod; 13 x = x*x%mod; 14 n >>= 1; 15 } 16 return y; 17 } 18 void init() { 19 a[1] = 1; 20 for(ll i = 2; i <= 2*n; i ++) a[i] = (a[i-1])*i%mod; 21 for(ll i = 1; i <= n; i ++) { 22 b[i] = pow_mod(a[i],mod-2); 23 } 24 } 25 ll C(int x, int y) { 26 return (a[x]*b[y])%mod*b[y]%mod; 27 } 28 int main() { 29 cin >> n; 30 init(); 31 for(int i = 1; i <= n; i ++) { 32 ans = (ans + C(i*2,i)) % mod; 33 } 34 cout << ans << endl; 35 return 0; 36 }