杭电4639

居然在最后的输出形式那里卡了很久,忘记除10007,忘记输出Case 希望下次不要犯这种错误

#include "iostream"
#include "string.h"
using namespace std;
int f[10100][100],maxb=0;
char list[110][10100];
int max(int a,int b){return a>b?a:b;}

void work(){
  int i,count,flag,j,num;
  memset(f,0,sizeof(f));
  f[0][0]=1;
  f[1][0]=1;
  f[2][0]=2;
  f[3][0]=3;
  count=1;
  for(i=4;i<=maxb;i++){
    flag=0;
    for(j=0;j<count;j++){
     f[i][j]=f[i-1][j]+f[i-2][j]+flag;
     flag=f[i][j]/10;
     f[i][j]=f[i][j]%10;
    }
    if(flag!=0){
      f[i][j]=flag;
      count++;
    }
    flag=0;
    if(f[i][4]>=1){
      flag=1;
      if(f[i][3]>=0){
        flag=1;
        if(f[i][2]>=0){
          flag=1;
          if(f[i][1]>=0){
            flag=1;
            if(f[i][0]>=7){
              flag=1;
            }
          }
        }
      }
    }
    if(flag){
      num=f[i][4]*10000+f[i][3]*1000+f[i][2]*100+f[i][1]*10+f[i][0];
      num=num%10007;
      f[i][4]=num/10000;
      num=num%10000;
      f[i][3]=num/1000;
      num=num%1000;
      f[i][2]=num/100;
      num=num%100;
      f[i][1]=num/10;
      f[i][0]=num%10;
    }
    count=4;
    //cout<<"* ";cout<<i<<' ';for(j=count-1;j>=0;j--)cout<<f[i][j];cout<<endl;
  }
}

int chang(int a){
    return f[a][4]*10000+f[a][3]*1000+f[a][2]*100+f[a][1]*10+f[a][0];
}

void work1(int a){
  int data=0,number=1,i;
  for(i=0;i<strlen(list[a]);i++){
    if(list[a][i]=='h'&&list[a][i+1]=='e'){data++;i++;}
    else {
     // cout<<data<<" ++++ "<<i<<endl;
      number*=chang(data);
      if(number>10007)
      number=number%10007;
      data=0;
    }
  }
  //cout<<data<<"()"<<endl;
  if(data!=0)number*=chang(data);
  if(number>10007)number=number%10007;
  cout<<"Case "<<a<<": "<<number<<endl;
}

int main(){
   int Case,i=1;
   cin>>Case;
   while(Case--){
      cin>>list[i];
      maxb=strlen(list[i]);
      work();
      work1(i);
      i++;
   }
}
原文地址:https://www.cnblogs.com/dowson/p/3265537.html