统计罗马数字表示的字符个数,构造法 #include<iostream> #include<fstream> #include<string> #include<memory.h> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<vector> using namespace std; ifstream fin("preface.in"); ofstream fout("preface.out"); int res[4000][7]; char val[7]={'I','V','X','L','C','D','M'}; int ans[7]; void init(){ memset(res,0,sizeof(res)); res[1][0]=1;res[5][1]=1;res[10][2]=1; res[50][3]=1;res[100][4]=1;res[500][5]=1; res[1000][6]=1; int cnt=1,j; for(int i=1;i<3501;i++){ if(i==1||i==5||i==10||i==50||i==100||i==500||i==1000) continue; int t=i; int wei=1; while(t){ int mm=t%10; if(mm<4){ for(j=0;j<7;j++) res[i][j]+=res[1*wei][j]*mm; } else if(mm==4){ for(j=0;j<7;j++) res[i][j]+=(res[1*wei][j]+res[5*wei][j]); } else if(mm<9){ for(j=0;j<7;j++) res[i][j]+=(res[5*wei][j]+res[1*wei][j]*(mm-5)); } else if(mm==9){ for(j=0;j<7;j++) res[i][j]+=(res[1*wei][j]+res[10*wei][j]); } t/=10; wei*=10; } } } int main(){ init(); int N; fin>>N; memset(ans,0,sizeof(ans)); for(int i=1;i<=N;i++){ for(int j=0;j<7;j++){ ans[j]+=res[i][j]; } } for(int k=0;k<7;k++){ if(ans[k]!=0){ fout<<val[k]<<" "<<ans[k]<<endl; } } return 0; }