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;
}

猜你喜欢

转载自www.cnblogs.com/gaudar/p/9755198.html
sgu
108
今日推荐