CCF模擬題——有趣的數(自己的見解)
阿新 • • 發佈:2019-02-07
問題描述
我們把一個數稱為有趣的,當且僅當:
1. 它的數字只包含0, 1, 2, 3,且這四個數字都出現過至少一次。
2. 所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。
3. 最高位數字不為0。
因此,符合我們定義的最小的有趣的數是2013。除此以外,4位的有趣的數還有兩個:2031和2301。
請計算恰好有n位的有趣的數的個數。由於答案可能非常大,只需要輸出答案除以1000000007的餘數。
輸入格式
輸入只有一行,包括恰好一個正整數n (4 ≤ n ≤ 1000)。
輸出格式
輸出只有一行,包括恰好n 位的整數中有趣的數的個數除以1000000007的餘數。
樣例輸入
4
樣例輸出
3
#include<iostream> #include<cstdio> using namespace std; struct student { int A; int L; }student; int size[2]={0}; struct student player[2][8]; void position(int who,int lo,int ac,int li) { if(lo>0) { size[who]++; for(int i=size[who];i>lo;i--) { player[who][i]=player[who][i-1]; } player[who][lo].A=ac; player[who][lo].L=li; } } void remove(int who,int lo) { if(lo>0) { for(int i=lo;i<size[who];i++) { player[who][i]=player[who][i+1]; } size[who]--; } } void attack(int who,int ac,int li) { player[1-who][ac].L-=player[who][li].A; player[who][li].L-=player[1-who][ac].A; if(player[1-who][ac].L<=0) remove(1-who,ac); if(player[who][li].L<=0) remove(who,li); } int main() { player[0][0].L=player[1][0].L=30; player[0][0].A=player[1][0].A=0; int N,lo,ac,li; int who=0; cin>>N; char str[15]; while(N--) { cin>>str; switch(str[0]) { case 's': cin>>lo>>ac>>li; position(who,lo,ac,li); break; case 'a': cin>>ac>>li; attack(who,ac,li); break; case 'e': who=1-who; break; } } for(int i=0;i<2;i++) { cout<<player[i][0].L<<endl; cout<<size[i]<<" "; for(int j=1;j<=size[i];j++) { cout<<player[i][j].L<<" "; } cout<<endl; } return 0; }