题目 一个数字x加上它各个位数得到数字y,那么x是y的生成元(x一通操作得到y) 比如120的生成元之一(可能?)是114.
给出一个数字n(1<=n<=100000),求最小生成元。
朴素做法,枚举n-1前每个数字的生成元,看它能否等于你要求的数字。 然后看一下数字n=1e5,我感觉没戏..
再想,我能不能把每个数字(x)能生成的y记录下来形成一种二元关系.然后它问哪个,我就查表给哪个就完事了,然后复杂度是O(n)吧
然后核心部分,至于中间某变量为什么叫xxxxx,我第一次做用的i,然后在循环里改变了i的值,然后华丽死循环出不来了.
for(i=1;i<=100000;i++){ int sum=0;dashabi=i;
while(dashabi){ temp=dashabi%10;dashabi/=10;sum+=temp;
}
p[i+sum].push_back(i);
}
这里用了vector, p[i+sum][k],然后让k=0,for k to p[i+sum].size(),就能遍历p[i+sum]的生成元,最后选出最小值
完整代码
#include<iostream>
#include<vector>
using namespace std;
vector<int> p[130000];
int main(){ int i,j,k,temp,n,m,len,min,dashabi;
for(i=1;i<=100000;i++){ int sum=0;dashabi=i;
while(dashabi){ temp=dashabi%10;dashabi/=10;sum+=temp;
}
p[i+sum].push_back(i);
} cin>>n;
for(i=1;i<=n;i++){ cin>>k;
len=p[k].size(); if(len==0) { cout<<'0'<<endl; continue;
}long long min=1145141919; for(j=0;j<len;j++) { if(p[k][j]<min) min=p[k][j];
} cout<<min<<endl;
}
return 0;}