zoukankan      html  css  js  c++  java
  • CodeForces 260A Adding Digits

    这道题目的意思是给你提供a, b, n 三个数

    a为 输入的数字 ,你需要在a后面加n次 ,每次可以加0-9

    但要保证每次加上去的那个数字能被b整除  

    不过数据规模有点大,用搜索会MLE(即使开了个开栈挂

    #pragma comment(linker, "/STACK:16777216") //for c++ Compiler
    #include <stdio.h>
    #include <iostream>
    #include <fstream>
    #include <cstring>
    #include <cmath>
    #include <stack>
    #include <string>
    #include <map>
    #include <set>
    #include <list>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #define Max(a,b) (((a) > (b)) ? (a) : (b))
    #define Min(a,b) (((a) < (b)) ? (a) : (b))
    #define Abs(x) (((x) > 0) ? (x) : (-(x)))
    #define MOD 1000000007
    #define pi acos(-1.0)
    
    using namespace std;
    
    typedef long long           ll      ;
    typedef unsigned long long  ull     ;
    typedef unsigned int        uint    ;
    typedef unsigned char       uchar   ;
    
    template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;}
    template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;}
    
    const double eps = 1e-7      ;
    const int N = 1              ;
    const int M = 200000         ;
    const ll P = 10000000097ll   ;
    const int INF = 0x3f3f3f3f   ;
    
    string a;
    int b, n;
    bool flag = false;
    
    string Multiply(string s,int x)  //大数乘以整形数
    {
        reverse(s.begin(),s.end());
        int cmp=0;
        for(int i=0;i<s.size();i++)
        {
            cmp=(s[i]-'0')*x+cmp;
            s[i]=(cmp%10+'0');
            cmp/=10;
        }
        while(cmp)
        {
            s+=(cmp%10+'0');
            cmp/=10;
        }
        reverse(s.begin(),s.end());
        return s;
    }
    
    string Except(string s,int x)  //大数除以整形数
    {
        int cmp=0,ok=0;
        string ans="";
        for(int i=0;i<s.size();i++)
        {
            cmp=(cmp*10+s[i]-'0');
            if(cmp>=x)
            {
                ok=1;
                ans+=(cmp/x+'0');
                cmp%=x;
            }
            else{
                if(ok==1)
                    ans+='0';  //注意这里啊。才找出错误
            }
        }
        return ans;
    }
    
    void dfs(string a, int len){
        if(flag)    return;
        if(n == len){
            cout << a << endl;
            flag = true;
            return;
        }
        for(int i = 0; i < 10; ++i){
            string num = a;
            num.push_back('0' + i);
            string nn = Except(num, b);
            string aa = Multiply(nn, b);
            if(aa.compare(num) == 0){
                dfs(num, len + 1);
            }
        }
    }
    
    int main(){
        int i, j, k, t, m, numCase = 0;
        //string hh = "123";
        //cout << atoi(hh.c_str());
        while(cin >> a >> b >> n){
            dfs(a, 0);
            if(!flag){
                cout << "-1" << endl;
            }
    
        }
    
        return 0;
    }
    MLE Code

    解题思路:

    非常巧妙,就是先在a后面加一个数字0-9如果能整除b,那么易得an后面跟无论多少个0都能整除b

    所以就在an后面构造出(n-1)个0即可

    无须搜索,超过30层容易爆空间~

    //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
    #include <stdio.h>
    #include <iostream>
    #include <fstream>
    #include <cstring>
    #include <cmath>
    #include <stack>
    #include <string>
    #include <map>
    #include <set>
    #include <list>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #define Max(a,b) (((a) > (b)) ? (a) : (b))
    #define Min(a,b) (((a) < (b)) ? (a) : (b))
    #define Abs(x) (((x) > 0) ? (x) : (-(x)))
    #define MOD 1000000007
    #define pi acos(-1.0)
    
    using namespace std;
    
    typedef long long           ll      ;
    typedef unsigned long long  ull     ;
    typedef unsigned int        uint    ;
    typedef unsigned char       uchar   ;
    
    template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;}
    template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;}
    
    const double eps = 1e-7      ;
    const int N = 1              ;
    const int M = 200000         ;
    const ll P = 10000000097ll   ;
    const int INF = 0x3f3f3f3f   ;
    
    
    
    int main(){
        int i, j, k, t, n, m, numCase = 0;
        int a, b, num;
        //string hh = "123";
        //cout << atoi(hh.c_str());
        while(cin >> a >> b >> n){
                bool flag = false;
                for(i = 0; i < 10; ++i){
                    num = a * 10 + i;
                    if(num % b == 0){
                        a = num;
                        flag = true;
                        break;
                    }
                }
                if(!flag){
                    cout << -1 << endl;
                    return 0;
                }
            cout << num;
            for(i = 1; i < n; ++i) cout << '0';
            cout << endl;
        }
    
        return 0;
    }
  • 相关阅读:
    【转帖】流程与IT管理部——IT支撑业务变革的必然趋势
    【转帖】39个让你受益的HTML5教程
    【转帖】2015年2月份最佳的免费 UI 工具包
    【消息】Pivotal Pivots 开源大数据处理的核心组件
    【转帖】创业者,你为什么这么着急?
    教程:SpagoBI开源商业智能之XML Template 图表模板
    教程:Spagobi开源BI系统 Console报表设计教程
    【转帖】Mysql多维数据仓库指南 第一篇 第1章
    Kiss MySQL goodbye for development and say hello to HSQLDB
    梯度消失和梯度爆炸问题详解
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/4282678.html
Copyright © 2011-2022 走看看