问题描述:
任给正整数N,求最小正整数M,使得N*M的十进制表示形式里只含1和0
#include <iostream>
#include <vector>
using namespace std;
#define MAX 1007
vector<vector<int>> BigInt(MAX);
int main(){
int N=99;
for(int i=0;i<N;i++)
BigInt[i].clear();
BigInt[1].push_back(0);
for(int i=1,j=10%N;;i++,j = (j*10)%N){
int NoUpdate=0;
bool flag=false;
if(BigInt[j].size()==0){
BigInt[j].clear();
BigInt[j].push_back(i);
}
for(int k=1;k<N;k++){
if(BigInt[k].size()>0
&&(i>BigInt[k][BigInt[k].size()-1])
&&(BigInt[(k+j)%N].size() == 0)){
flag=true;
BigInt[(k+j)%N]=BigInt[k];
BigInt[(k+j)%N].push_back(i);
}
}
if(flag==false)
NoUpdate++;
//如果经过一个循环节都没对BigInt进行更新,就是无解
//或者BigInt[0]!=NULL,已经找到解
if(NoUpdate == N||BigInt[0].size()>0)
break;
}
if(BigInt[0].size()==0){
}
else{
cout<<"N*M=";
for(int i=BigInt[0][BigInt[0].size()-1],j=BigInt[0].size()-1;i>=0;i--){
if(j>=0&&i==BigInt[0][j]){
cout<<"1";
j--;
}
else{
cout<<"0";
}
}
}
return 0;
}