zoukankan      html  css  js  c++  java
  • 2015 Multi-University Training Contest 1

     Y sequence

    Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5297


     

    Mean: 

     有连续数列A={1,2,3,4,5,6,7,8 .....},将可以表示成a^b次方的数删除,a={1,2,3,4,5...},而2<=b<=r,删除后形成一个新的数列,求这个数列的第n项。

    analyse:

    很有趣的一道数论题。

    对于给定的一个n,如果我们知道1~n中被删除的数字为k个,那么答案一定大于等于n+k,所以向后至少移动k个数。

    但是n~n+k这一段中也可能含有被删除的数字,所以我们再求n~n+k这一段中被删除的数字的个数,假设为x1个,那么我们就得到了一个比x更精确的数字x1,即:我们要得到第n项,至少需要从n向后移动x1位。

    但是移动x1位后同样还可能存在以上的问题,那么什么时候停止呢?答案是:当本次算的xi和上次算的xi相等时,就说明这个值是固定的了,也就是最终的精确值,代表第n项就是n+xi,也就是最终的答案。

    有了这个理论基础后,我们来考虑如何求得1~n中有多少个数字能够表示成次幂形式。

    解决这个问题的方法是反函数。幂的反函数是依然是幂函数,指数取导就行。

    例:10以内能表示成a^2的数的个数为:pow(10,1/2) ; 100以内能表示成a^4的数的个数是:pow(100,1/4).

    还有一个问题:在删除数的时候,a^6的数已经被a^2和a^3的数删过了,这样就造成了重复删除。

    这儿就需要容斥原理来解决:只需要删质数次幂的数就行,而且还需要把质数的乘积(多删的)删除的数字加回来。

    详情参考大牛博客:http://blog.csdn.net/firstlucker/article/details/46991885

    Time complexity: O(N)

     

    Source code: 

    /*
    * this code is made by crazyacking
    * Verdict: Accepted
    * Submission Date: 2015-07-22-15.56
    * Time: 0MS
    * Memory: 137KB
    */
    #include <queue>
    #include <cstdio>
    #include <set>
    #include <string>
    #include <stack>
    #include <cmath>
    #include <climits>
    #include <map>
    #include <cstdlib>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    #define  LL long long
    #define  ULL unsigned long long
    using namespace std;
    long long t, n, r;
    const int p[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67};
    vector<int> rongchi;
    void get_rongchi()
    {
          rongchi.clear();
          for( int i = 0; p[i] <= r; ++i )
          {
                int si = rongchi.size();
                for( int j = 0; j < si; ++j )
                {
                      if( abs( p[i]*rongchi[j] ) <= 63 )
                            rongchi.push_back( -p[i]*rongchi[j] );
                }
                rongchi.push_back( p[i] );
          }
    }
    
    long long cal( long long x )
    {
          if( x == 1 ) return 0;
          long long ans = x;
          for( int i = 0; i < rongchi.size(); ++i )
          {
                long long tmp = ( long long )( pow( x + 0.5 , 1.0 / abs( rongchi[i] ) ) ) - 1;
                if( rongchi[i] < 0 ) ans += tmp;
                else ans -= tmp;
          }
          return ans - 1;
    }
    long long solve()
    {
          get_rongchi();
          long long ans = n;
          while( true )
          {
                long long tmp = cal( ans );
                if( tmp == n )break;
                ans += n - tmp;
          }
          return ans;
    }
    
    int main()
    {
          ios_base::sync_with_stdio( false );
          cin.tie( 0 );
          cin >> t;
          while( t-- )
          {
                cin >> n >> r;
                cout << solve() << endl;
          }
          return 0;
    }
    /*
    
    */
    

      

      

  • 相关阅读:
    UCOS内核
    ##API(七)————日期操作类(二)
    ##Webstrom打开显示老长一段英文This lincense GY4D6P7914 has been cancelled.,就是打不开怎么解决
    ##API(六)————日期操作类(一)
    ##API(五)————StringBuffer类和StringBuilder类(重要)
    ##API(四)————String类的常用方法
    ##API(三)————Math类
    ##API(二)————包装类
    ##API的简介
    ##API(一)————枚举
  • 原文地址:https://www.cnblogs.com/crazyacking/p/4668093.html
Copyright © 2011-2022 走看看