sgu 108 Self-numbers 2
题意:这样的数有几个?
模仿筛法就能解出,但是内存不够。这就需要重复利用数组,用100大小的数组,所有的数对100取模。对于一个数,比如71,就在arr[78]=71记录下来。到78时,检查78-71<90。说明近期有数能产生78。而178对100取模也是78,如果后来(比178小90以内的数)没有数能产生78。那么178-arr[178]将>90就是符合条件的。而比178小90以内的数只能产生178,不可能产生78或者278。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=100,INF=0x7FFFFFFF; int apr[SZ]; int arr[SZ],sz; map<int,int> mp; int dgt(int x) { int res=0; for(;x;res+=x%10,x/=10); return res; } void init(int x) { for(int i=0;i<SZ;++i)apr[i]=-100; //cout<<"h"<<endl; for(int i=1;i<=x;++i) { apr[(i+dgt(i))%SZ]=i; if(i-apr[i%SZ]>90) { ++sz;//cout<<sz<<" "<<i<<endl; if(mp.find(sz)!=mp.end())mp[sz]=i; } } } int main() { //cout<<ceil(-10.3)<<endl; std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); int n,m; cin>>n>>m; vector<int> vct; for(int i=0;i<m;++i) { int tmp; cin>>tmp; mp[tmp]=0; vct.push_back(tmp); } init(n); cout<<sz<<endl; for(int i=0;i<vct.size();++i) { if(i)cout<<" "; cout<<mp[vct[i]]; } cout<<endl; return 0; }