timus 1095 Nikifor 3【思路】

来源:互联网 发布:开源php cms 微信 编辑:程序博客网 时间:2024/06/18 13:52

传送门:timus 1095

题意:给出一个数字(可能是大数),其中1,2,3,4每个数至少出现一次,将大数数字重新排列,输出一个能被7整除且不以0为前缀的结果,如果没有,则输出0

思路:

利用1,2,3,4至少出现一次的信息先枚举一下他们的组合mod7的情况,因为所有整形数mod7结果只能出现7种情况

7是一个不一般的数啊 不一般体现在这里

( 10%7=3

  20%7=6

  30%7=2;

  40%7=5;

  50%7=1;

  60%7=4;)

这个可以先通过写测试代码来模拟相应的结果

 int i,j,k,h,sum;   bool map[7];  //标记是否已有满足条件的数   char comb[7][10];    memset(map,false,sizeof(map));   for(i=1;i<=4;i++)     for(j=1;j<=4;j++)       for(k=1;k<=4;k++)         for(h=1;h<=4;h++)           if(i!=j&&i!=k&&i!=h&&j!=k&&j!=h&&k!=h){               sum=i*1000+j*100+k*10+h;  if(map[sum%7]==false){  map[sum%7]=true;  comb[sum%7][0]=i;  comb[sum%7][1]=j;  comb[sum%7][2]=k;  comb[sum%7][3]=h;  comb[sum%7][4]='\0';  }   }    for(i=0;i<7;i++){       if(map[i])printf("mod7余%d:%s\n",i,comb[i]);   }
输出发现0~6都有对应的comb值

这说明什么?尽在不言中!

前缀不能为0,那把所有0安排在最后面

1,2,3,4每个数留一个做最后的判断,

像 11112345670

就可以先求出111567的余数,把0放到最后(嗯,看到这里应该不用再说下去了,已经显而易见该怎么弄了吧!)

是不是可以再把题目改编一下,如果输出结果是大数能被9整除呢?

(这个应该是更简单的!呼呼,比较杂乱的推理)


0 0