通化邀请赛题目重现解题报告
今天做了一下通化邀请赛的题目重现,有些题都不会呢,想搜一下,感觉都搜不到...
今天自己做了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; }