zoukankan      html  css  js  c++  java
  • URAL 1495 One-two, One-two 2

    URAL 1495

    思路:

    折半枚举+高精度技巧。

    先dfs枚举出小于等于15位的情况。

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

    _dp[i]表示余数为i正好15的数。

    然后枚举余数i,把它乘以1e15再模n后得到t,然后找_dp[n-t]

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define pb push_back
    #define mem(a,b) memset(a,b,sizeof(a))
    
    const int N=1e6+5;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    ll dp[N],_dp[N];
    int n;
    void dfs(ll num,int deep){
        if(num){
            dp[num%n]=min(dp[num%n],num);
            if(deep==15){
                _dp[num%n]=min(_dp[num%n],num);
                return ;
            }
        }
        dfs(num*10+1,deep+1);
        dfs(num*10+2,deep+1);
    }
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>n;
        mem(dp,INF);
        mem(_dp,INF);
        dfs(0,0);
        if(dp[0]!=INF){
            cout<<dp[0]<<endl;
            return 0;
        }
        ll sum1=0,sum2=0;
        for(int i=0;i<n;i++){
            if(dp[i]==INF)continue;
            ll t=i;
            for(int j=0;j<15;j++)t=(t*10)%n;
            ll x=n-t;
            if(_dp[x]==INF)continue;
            if(sum1==0||dp[i]<sum1){
                sum1=dp[i];
                sum2=_dp[x];
            }
        }
        if(sum1)cout<<sum1<<sum2<<endl;
        else cout<<"Impossible"<<endl;
        return 0;
    }
  • 相关阅读:
    Makefile 跟着走快点
    MariaDB 复合语句和优化套路
    Unity Shader常用函数,标签,指令,宏总结(持续更新)
    ThreadLocal 简述
    Java全排列排序
    Thrift入门
    Nginx + Keepalived 双机热备
    Linux 虚拟IP
    Java 反编译
    Spring拦截器
  • 原文地址:https://www.cnblogs.com/widsom/p/8378922.html
Copyright © 2011-2022 走看看