通化邀请赛题目重现解题报告

    今天做了一下通化邀请赛的题目重现,有些题都不会呢,想搜一下,感觉都搜不到...

    今天自己做了4题吧..我打代码的速度还是太慢了..

    先是1007的Canon,就是在中国象棋的棋盘里放炮,使得两两都不被吃,最多能放多少个.棋盘上可能原本就放了一些棋子(不是炮的),之前一直敲错,原来理解错了题意,注意是炮不被吃就可以了,原来的棋子是可以吃的.棋盘5*5,很小,搜一下就可以了,每次搜判断可不可以放就很容易过了的~.

    然后是1010Dice.学会写递推就好F(n)=F(n-1)+1/6+5/6*(F(n)) 解一下F(n)=(6^n-1)/5

                                               H(n)=G(n-1)+1/6+5/6(1+F(n))      H(n)=6*(6^n-1)/5

                                               G(m)=G(m-1)+G(1)                      G(m)=6m

   解不等式即可,G(m)>H(n)不难,G(m)>F(n)时两边除以6化简一下就会有  m>(6^(n-1)-1)/5+1/6 所以m=(6^(n-1)-1)/5+1

   算的时候要用下5的逆元

  

#include<iostream>   
#include<cstdio> 
#include<algorithm>
using namespace std;

int b[5][5];
int dx[4]={-1,1,0,0};  
int dy[4]={0,0,-1,1};
int n,m,q;
int ans;

void dfs(int idx,int tb[5][5],int cur)
{
    ans=max(cur,ans);
    if(idx==n*m) {return;}
    int x=idx/m,y=idx%m;
    dfs(idx+1,tb,cur);
    if(tb[x][y]!=0){
        return;
    }
    int cb[5][5];memcpy(cb,tb,sizeof(cb));
    int tx=x,ty=y;
    for(int i=0;i<4;i++){
        x=tx;y=ty;
        while(x+dx[i]<n&&y+dy[i]<m&&x+dx[i]>=0&&y+dy[i]>=0){
            x+=dx[i];y+=dy[i];
            if(cb[x][y]>0) {break;}
        }
        while(x+dx[i]<n&&y+dy[i]<m&&x+dx[i]>=0&&y+dy[i]>=0){
            x+=dx[i];y+=dy[i];
            if(cb[x][y]==1) {break;}
            if(cb[x][y]==2) {return;}
        }
    }
    cb[tx][ty]=2;
    dfs(idx+1,cb,cur+1);
}


int main()
{
    while(cin>>n>>m>>q)
    {
        memset(b,0,sizeof(b));
        int tx,ty;
        for(int i=0;i<q;i++){
            scanf("%d%d",&tx,&ty);
            b[tx][ty]=1;
        }
        ans=-1;
        dfs(0,b,0);
        printf("%d\n",ans);
    }
    return 0;
}

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#define ll long long
#define mod 2011
using namespace std;

ll mod_pow(ll x,ll n,ll mmod=mod)
{
    ll res=1;
    while(n>0){
        if(n&1) res=res*x%mod;
        x=x*x%mod;
        n>>=1;
    }
    return res;
}

ll n;
ll inverse=1609;

int main()
{
    while(cin>>n&&n)
    {
        ll ans1=((mod_pow(6,n-1)-1)*inverse+1)%mod;
        ll ans2=((mod_pow(6,n)-1)*inverse)%mod;
        cout<<ans1<<" "<<ans2<<endl;
    }
    return 0;
}

 

posted @ 2013-08-24 19:29  chanme  阅读(271)  评论(0编辑  收藏  举报