Ural 1495

来源:互联网 发布:mysql将null转为0 编辑:程序博客网 时间:2024/06/07 23:49

PRO IS HERE


题目大意就是问是否存在长度小于31的仅有1,2组成的数,整除n。若有,输出最小的。

dp[i] 表示模为i的最小的数。

考虑(1<<31) 不用高精度。


#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<set>#include<queue>#include<map>#include<iostream>using namespace std;#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)#define bug puts("Fuck");#define LL long long#define pb push_back#define mp make_pair#define nMax 1010000#define eps 1e-8#define inf 0x7fffffffLL dp[2][nMax];int mod[31];int n;void init(){int t=1;mod[1]=1;for(int i=2;i<31;i++){mod[i] = mod[i-1]*10%n;}}int main(){#ifndef ONLINE_JUDGEfreopen("input.txt","r",stdin);//freopen("output.txt","w",stdout);#endifwhile(~scanf("%d",&n)){    init();    memset(dp,-1,sizeof(dp));        dp[0][0]=0;        int cur=1;        for(int i=0;i<30;i++){            memset(dp[cur],-1,sizeof(dp[cur]));            for(int j=0;j<n;j++)if(dp[cur^1][j]!=-1){                for(int k=1;k<3;k++){                    int t=(j+k*mod[i+1])%n;                    if(dp[cur][t]==-1 || dp[cur][t] > dp[cur^1][j]+((k-1)<<(i+1)))                        dp[cur][t]=dp[cur^1][j]+((k-1)<<(i+1));                }            }            if(dp[cur][0]!=-1) {                int step=i+2;                while(step-->1){                    printf("%d",((dp[cur][0]&(1<<step))!=0)+1);                }                printf("\n");                return 0;            }            cur^=1;        }        printf("Impossible\n");}return 0;}


原创粉丝点击