问题:
任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
思路:
建立模N的余数记录表,通过动态规划的思想找到相应的M;
例子:
当N=3时:
Record | 1 | 10 | 100 |
0 | 111 | ||
1 | 1 | ||
2 | 11 |
当j=10时,j%N=1存在且1比10小,不更新;但(1+j)%N=2,更新record;
当j=100时,j%N=1存在且1比100小,不更新;(j+1)%N=2存在且11比101小,不更新;(j+11)%N=0,更新record;
此时发现record[0]不为空,找到N*M,返回M
代码:
#include <iostream>
#include <vector>
using namespace std;
long long findConditionNumber(long long var)
{
if (var==0)
{
return var;
}
vector<long long> record(var);
for (int i=0;;i++)
{
long long j = pow(10,i); //10^i
bool isUpdate = false;
if (record[j%var]==0)
{
record[j%var]=j;
isUpdate = true;
}
//update
for (int k=0;k<var;++k)
{
//1.存在余数为k的变量记录 2.j>该记录 3.j与该记录相加所得的余数没有记录
if (record[k]!=0&&j>record[k]&&record[(record[k]+j)%var]==0)
{
isUpdate = true;
record[(record[k]+j)%var] = record[k]+j;
}
}
if (!isUpdate)
{
return -1;
}
//Find the condition number
if (record[0]!=0)
{
return record[0]/var;
}
}
}
int main()
{
long long v;
while (cin>>v)
{
cout<<findConditionNumber(v)<<endl;
}
}