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; 
For(inti = 1; i <= n; i++) 
    For(int v = 0; v <= n; v++) 
        Ans = (Ans + C(i, v) * C(i, v)) % 998244353;
C(i,v)为组合数第i行第v列的数。
给你上面的代码中的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;
}

 

 

 

posted @ 2018-06-09 22:01  Somnus、M  阅读(232)  评论(0编辑  收藏  举报