fzu2223

#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include <stdio.h>
#include <algorithm>
#include <map>

typedef long long LL ;

namespace  MyMap{
    const static int  MOD = 1000007  ;
    int  head[MOD] ;

    LL   val[MOD] ;
    int  next[MOD] ;
    int  to[MOD] ;
    int  size  ;

    void clear(){
        memset(head , -1 , sizeof(head)) ;
        size = 0 ;
    }

    int find(LL x){
        long u = (x % MOD + MOD) % MOD ;
        for(int i = head[u] ; i != -1 ; i = next[i]){
            if(val[i] == x) return to[i] ;
        }
        return -1 ;
    }

    void  insert(LL x , int y){
        int u = (x % MOD + MOD) % MOD ;
        val[size] = x ;
        to[size] = y ;
        next[size] = head[u] ;
        head[u] = size++ ;
    }

};

void gao(LL n , LL m){
     if(n % m == 0){
         printf("%I64d\n" , n / m) ;
         return ;
     }

     std::vector<char> res ;
     MyMap::clear() ;
     int resSize = 0 ;
     LL d = n / m ;
     if(d == 0) res.push_back('0') ;
     while(d){
        res.push_back( (d%10) + '0' ) ;
        d /= 10 ;
     }
     std::reverse(res.begin() , res.end()) ;

     res.push_back('.');
     int idx = 0 ;
     n %= m ;
     while(MyMap::find(n) == -1){
        MyMap::insert(n , idx++)  ;
        n *= 10 ;
        res.push_back( (n/m) + '0' ) ;
        if(res.size() > 1000000){
            puts("Too long") ;
            return ;
        }
        n %= m ;
        if(n == 0) break ;
     }
     if(n > 0){
        int lenth = idx - MyMap::find(n)  ;
        int i = res.size()  - lenth ;
        res.insert(res.begin() + i , '(') ;
        res.push_back( ')' ) ;
     }
     if(res.size() > 1000000){
        puts("Too long") ;
        return ;
     }
     for(std::vector<char>::iterator it = res.begin() ; it != res.end() ; it++)
        putchar(*it) ;
     putchar('\n') ;
}

int main()
{
    LL n , m ;
    int t ;
    std::cin>>t ;
    while(t--){
        std::cin>>n>>m ;
        gao(n , m) ;
    }
    return 0;
}


string + 操作太慢,用string超时


#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include <stdio.h>
#include <algorithm>
#include <map>

typedef long long LL ;
//std::map<int , int> re ;

std::string intTostring(LL n){
    if(n == 0) return "0" ;
    std::string s = "" ;
    while(n){
        char c = (n%10) + '0' ;
        s = c + s ;
        n /= 10 ;
    }
    return s ;
}

struct  MyMap{
       const int  MOD = 1000007  ;
       LL   val[MOD+8] ;
       int  head[MOD+8] ;
       int  next[MOD+8] ;
       int  to[MOD+8] ;
       int  size  ;

        void clear(){
               memset(head , -1 , sizeof(head)) ;
               size = 0 ;
       }

        int  find(LL x){
               long u = (x % MOD + MOD) % MOD ;
               for(int i = head[u] ; i != -1 ; i = next[i]){
                     if(val[i] == x) return to[i] ;
               }
               return -1 ;
       }

        void  insert(LL x , int y){
               int u = (x % MOD + MOD) % MOD ;
               val[size] = x ;
               to[size] = y ;
               next[size] = head[u] ;
               head[u] = size++ ;
       }

};

MyMap re ;

std::string gao(LL n , LL m){
     if(n % m == 0){
        return  intTostring(n/m) ;
     }

     re.clear() ;
     std::string res ;
     res += intTostring(n/m) ;
     res += "." ;
     int idx = 0 ;
     n %= m ;
     while(re.find(n) == -1){
        re.insert(n , idx++ )  ;
        n *= 10 ;
        res += intTostring(n/m) ;
        if(res.length() > 1000000)
            return "Too long" ;
        n %= m ;
        if(n == 0) break ;
     }
     if(n > 0){
        int lenth = idx - re.find(n)  ;
        int i = res.length() - lenth ;
        res.insert(res.begin() + i , '(') ;
        res += ")" ;
     }
     if(res.length() > 1000000)
            return "Too long" ;
     return res ;
}

int main()
{
    LL n , m ;
    int t ;
    std::cin>>t ;
    while(t--){
        std::cin>>n>>m ;
        printf("%s\n" , gao(n , m).c_str()) ;
    }
    return 0;
}




你可能感兴趣的:(fzu2223)