Loading

代码-洛谷P1602 Sramoc问题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define bg begin()
#define ed end()
#define pb push_back
#define mp make_pair
#define sz(a) int((a).size())
#define R(i,n) for(int i(0);i<(n);++i)
#define L(i,n) for(int i((n)-1);~i;--i)
const int iinf=0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
 
//Data
const int N=1e6;
int k,n;
vector<int> pw;
vector<bitset<N>> b[11];
bitset<N> tmp,tot;
 
//Main
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>k>>n; int w=-1;
    R(i,1123)if(!i){
        pw.pb(1),tot.reset();
        R(d,k) tmp.reset(),d&&(tmp.set(d%n),true),tot|=tmp,b[d].pb(tmp);
        if(b[k].pb(tot),b[k][0][0]){w=i;break;}
    } else {
        pw.pb(pw[i-1]*10%n),tot.reset();
        R(d,k) tmp=(b[k][i-1]<<d*pw[i]%n)|(b[k][i-1]>>(n-d*pw[i]%n)),
            d&&(tmp.set(d*pw[i]%n),true),tot|=tmp,b[d].pb(tmp);
        if(b[k].pb(tot),b[k][i][0]){w=i;break;}
    }
    if(!~w) assert(0);
    else {
        int now=0;
        L(i,w+1){
            int x=0;
            R(d,k)if(b[d][i][now]){x=d,now=(now-d*pw[i]%n+n)%n;break;}
            cout<<x;
        }
        cout<<'\n';
    }
    return 0;
}
posted @ 2020-11-14 13:30  George1123  阅读(62)  评论(0)    收藏  举报