给你长度为 10^5~10^6长度,由数字组成的串 其中有4位不见了 补全该串 使得在该串能整除 77的同时 尽可能大
// 先计算出每个 n*10^m 模 77 的循环节 n=0,1,2..,9
// 然求出串的每位 mod 77 累加 抹黑的4为另外处理
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <math.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxm 100010
#define maxn 1000110
int rc[10][10];
int num[10];
void calculate(int n){
int vi[100]={0};
int m=n;
int ct=0;
rc[m][ct++]=m;
vi[n]=true;
while(1){
n=n*10;
n=n%77;
if(vi[n]) break;
vi[n]=true;
rc[m][ct++]=n;
// printf("%d
",n);
}
num[m]=ct;
}
char str[maxn];
int main()
{
int i,j,k,l;
int d[11]={0,9,8,7,6,5,4,3,2,1,0};
int a[5];
for(i=1;i<=9;i++)
calculate(i);
num[0]=1;
// for(i=1;i<=9;printf("
"),i++)
// for(j=0;j<num[i];j++)
// printf("%d ",rc[i][j]);
int tp;
// printf("%d
",11167%77);
while(scanf("%s",str)!=EOF){
int len=strlen(str);
tp=j=0;
for(i=0;i<len;i++){
if(str[len-i-1]!='x'){
k=str[len-i-1]-'0';
tp+=rc[k][i%num[k]];
}else{
a[++j]=i;
// printf("%d ",i);
}
}
// printf("%d
",tp);
int lin;
int flag=1;
for(i=1;i<=10;i++)
{
for(j=1;j<=10;j++)
{
for(k=1;k<=10;k++){
for(l=1;l<=10;l++){
lin=tp+rc[d[l]][a[1]%num[d[l]]];
lin=lin+rc[d[k]][a[2]%num[d[k]]];
lin=lin+rc[d[j]][a[3]%num[d[j]]];
lin=lin+rc[d[i]][a[4]%num[d[i]]];
if(lin%77==0) {flag=0;break;}
}
if(!flag) break;
}
if(!flag) break;
}
if(!flag) break;
}
str[len-a[1]-1]='0'+d[l];
str[len-a[2]-1]='0'+d[k];
str[len-a[3]-1]='0'+d[j];
str[len-a[4]-1]='0'+d[i];
printf("%s
",str);
}
return 0;
}