zoukankan      html  css  js  c++  java
  • BestCoder Round #60/HDU 5505 暴力数学

    GT and numbers

     
    问题描述
    给出两个数NN和MM。
    NN每次可以乘上一个自己的因数变成新的NN。
    求最初的NN到MM至少需要几步。
    如果永远也到不了输出-11。
    输入描述
    第一行读入一个数TT表示数据组数。
    接下来TT行,每行两个数NN和MM。
    Tleq1000T1000, 1leq N leq 10000001N1000000,1 leq M leq 2^{63}1M263​​.
    
    注意M的范围。hack时建议输出最后一行的行末回车;每一行的结尾不要输出空格。
    输出描述
    对于每组数据,输出一个数表示答案。
    输入样例
    3
    1 1
    1 2
    2 4
    输出样例
    0
    -1
    1

    题解:对n质数分解成x个指数因子,再对m进行整除到底,知道所得m为1为止,记录步数ans就是答案,否则-1;
    ///1085422276
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    #include<map>
    #include<bitset>
    #include<set>
    #include<vector>
    using namespace std ;
    typedef unsigned long long ll;
    #define mem(a) memset(a,0,sizeof(a))
    #define meminf(a) memset(a,127,sizeof(a));
    #define memfy(a)  memset(a,-1,sizeof(a));
    #define TS printf("111111
    ");
    #define FOR(i,a,b) for( int i=a;i<=b;i++)
    #define FORJ(i,a,b) for(int i=a;i>=b;i--)
    
    #define inf 100000000
    inline ll read()
    {
        ll x=0,f=1;
        char ch=getchar();
        while(ch<'0'||ch>'9')
        {
            if(ch=='-')f=-1;
            ch=getchar();
        }
        while(ch>='0'&&ch<='9')
        {
            x=x*10+ch-'0';
            ch=getchar();
        }
        return x*f;
    }
    //***************************************
    #define maxn 1000000+5
      bool P[maxn];
      int k;
      int  prime[maxn];
      vector<int  >V;
      int H[maxn],S[maxn];
      void init()
      {
          P[1]=1;
        for(int i=1;i<=1000001;i++)
          {
              if(!P[i])
              {
                  for(int j=i+i;j<=1000001;j=j+i)
                    P[j]=1;
              }
          }
          k=0;
          for(int i=1;i<=1000001;i++)
          {
              if(!P[i])
                 prime[++k]=i;
          }
      }
     __int64 get( __int64 x,__int64 y)
      {
          __int64 j=1;
          while(y<x)
          {
              x-=y;
              j++;
              y+=y;
          }
          if(j==0)j++;
          return j;
      }
      int main()
      {
          int T;
          init();
          scanf("%d",&T);
    
          while(T--)
          {
              V.clear();
              ll n=read();
              ll m=read();
              if(n==m)
              {
                  printf("0
    ");
                  continue;
              }
              if(n>m)
              {
                printf("-1
    ");
                  continue;
              }
              if(n==1)
              {
                 printf("-1
    ");
                  continue;
              }
              if(m%n){
                cout<<-1<<endl;
                continue;
              }
              ll tmp=m/n;//cout<<tmp<<endl;
             for(int i=1;i<=k;i++)
             {
                 while(n%prime[i]==0)
                 {
                     if(H[prime[i]]==0)
                     V.push_back(prime[i]);
                     H[prime[i]]++;
                     n/=prime[i];
                 }if(prime[i]>n)break;
             } // for(int i=0;i<V.size();i++)cout<<V[i]<<endl;
            __int64  ans=0;
             for(int i=0;i<V.size();i++)
             {
                 if(tmp%V[i]==0) {
                     ll jj=0;
                     while(tmp%V[i]==0)
                     {
                         tmp/=V[i];
                         jj++;
                     }
                    ans=max(ans,get(jj,H[V[i]]));
                 }
                 H[V[i]]=0;
             }
             if(tmp!=1){
                printf("-1
    ");
             }
             else printf("%I64d
    ",ans);
    
          }
    
          return 0;
      }
    代码
  • 相关阅读:
    10月17日学习日志
    10月10日学习日志
    10月15日学习日志
    ERP临时汇报打草稿
    锁定字段的几个方法
    Mvc model验证总结
    Html5 WebSocket详细介绍
    C#连接Oracle数据库的方法(System.Data.OracleClient、Oracle.DataAccess.Client也叫ODP.net、Oracle.ManagedDataAccess.dll)
    MVC Ajax调用Action时OnActionExecuting RedirectResult 无法跳转的处理办法
    C#调用存储过程中事务级临时表返回DataTable列乱序解决办法
  • 原文地址:https://www.cnblogs.com/zxhl/p/4893055.html
Copyright © 2011-2022 走看看