Wannafly挑战赛17
链接:https://www.nowcoder.com/acm/contest/114/A
来源:牛客网
A走格子
在平面上有n*n大小的正方形,定义正方形左下角坐标是(1,1),右下角坐标是(n,1)
现在A君在左下角,他的初始方向是向右,他要在正方形内走m步
当A君碰到边界或者已经走过的格子时,他便会逆时针转90°继续走,直到走完m步。
现在给你两个整数n和m,请算出走完m步后A君的坐标。
虽然知道模拟题,竟然一直没有想到做题方法。。。
只需要定义一个f数组,如果f=1的话直接转90度走就行了
开始先将周围标成f=1
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=2000+100; int n,m; int X[4]={1,0,-1,0}; int Y[4]={0,1,0,-1}; int f[maxn][maxn]; int main() { ios::sync_with_stdio(false); cin>>n>>m; memset(f,0,sizeof(f)); f[1][1]=1; for(int i=0;i<=n+1;i++) { f[0][i]=1; f[n+1][i]=1; f[i][0]=1; f[i][n+1]=1; } int step=0; int x=1,y=1; int dir=0; while(step<m) { step++; int newx=x+X[dir]; int newy=y+Y[dir]; if(f[newx][newy]==1) { dir=(dir+1)%4; x+=X[dir]; y+=Y[dir]; } else{ x=newx;y=newy; } f[x][y]=1; } printf("%d %d\n",x,y); return 0; }
B-求值2
链接:https://www.nowcoder.com/acm/contest/114/B
来源:牛客网
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的值。
组合数题,运用组合数模板就可以啦,数组开小了结果导致一直wa。。。
记住公式C(n,1)^2+C(n,2)^2+...+C(n,n)^2=C(2n,n)
#include <iostream> using namespace std; typedef long long LL; const int maxn=2e6+100; const LL mod= 998244353; LL ans=0,n; LL fact[maxn],fiv[maxn]; LL quickM(LL base, LL b) { LL ans = 1; while(b) { if(b&1) ans = (ans * base) % mod; base = (base*base) % mod; b >>= 1; } return ans%mod; } void init() { fact[0] = 1; for(int i = 1; i <= maxn; ++i) fact[i] = fact[i-1]*i%mod; fiv[maxn] = quickM(fact[maxn], mod-2)%mod; for(int i = maxn; i >= 0; --i) { fiv[i-1] = fiv[i]*(i); fiv[i-1] %= mod; } } LL C(int n, int m) { if(m > n) return 0; if(m==0) return 1; return (fact[n]*fiv[n-m]%mod*fiv[m]%mod)%mod; } int main() { ios::sync_with_stdio(false); init(); cin>>n; for(int i=1;i<=n;i++) { ans=(ans+fact[i*2]*fiv[i]%mod*fiv[i]%mod)%mod; } cout<<ans%mod<<endl; return 0; }