http://acm.fzu.edu.cn/problem.php?pid=1675
题意:
给你一个最多有1000000为的整数N,现在已知其中有连续的4位数字被破坏了而看不清楚了,
已知的是这个整数能被77整除,求最大的满足条件的N。
思路:
整数N中有连续的4位被破坏,我们可以先把未知的位置的数都先用0补上,然后用试除法求出
这个不完整N的余数,记为a;剩下的我们就可以去枚举那个未知的四位数(从大到小枚举),
用枚举的这个四位数在后面补上0,然后加上不完整的N就是最终的N,要求最终的N被77整除,
所以我们可以让枚举数并上0之后的数的余数与a互补,这样最终的余数就是0。这里还需要用
到预处理出10^x%77的值。
代码:
#include<stdio.h>
#include<string.h>
const int MAXN = 1000010 ;
char str[MAXN] ;
int len ;
int mm[MAXN] ;
void calc(){
mm[0] = 1 ;
for(int i=1;i<MAXN;i++){
mm[i] = mm[i-1] * 10 % 77 ;
}
}
int cal(){
int res = 0 ;
for(int i=0;i<len;i++){
res = res*10 + str[i] - '0' ;
res = res % 77 ;
}
return res ;
}
int main(){
calc() ;
while(scanf("%s",str) == 1){
len = strlen(str) ;
int pos ;
for(int i=0;i<len;i++){
if( str[i] == 'x' ){
str[i] = '0' ;
pos = i ;
}
}
int mod = cal() ;
int b = mm[len-pos-1] ;
int ans ;
for(int a=9999;a>=1000;a--){
int aa = a % 77 ;
aa = ( aa * b + mod )% 77 ;
if(aa == 0){
ans = a ; break ;
}
}
for(int i=0;i<4;i++){
int j = pos - i ;
str[j] = ans%10 + '0' ;
ans /= 10 ;
}
printf("%s\n",str);
}
return 0;
}