[多校2015.01.1010 容斥+迭代] hdu 5297 Y sequence

题意:

给你一个n和一个r,求Y序列的第N项是多少。

所谓的Y序列就是,从1开始,去掉能表示成a^b(2<=b<=r)的数,所构成的序列

例如r=2

序列就是:2,3,5,6,7,8,10,11,12,13,14,15,17....

思路:

我们应该能想到需要一个函数fun(x) 求的是1~x内在Y序列里的数有多少个

这个其实不难,我们可以运用容斥原理,通过63以内的素数进行计算,并且最多做三遍,因为2*3*5*7>63

然后就是一个很神奇的方法了,这个方法特别的秒

就是迭代的方法。

假设我们现在要求第N个Y序列的数,先假设第N个数就是N,那么我们求一下fun(N)=tep

tep代表在Y序列里的有tep个数,不在的就有 N-tep个。

这样我们下次就再求 fun(N+(N-tep)) 看看是否等于N,这样不断迭代下去

直到tep==N为止

为什么这样的是对的呢

因为我们每次只加缺少的个数,其实就是假设如果加的这些数都不会被剔除的话,那么就是答案了。

所以不可能加的超过正确答案。

然后由于很明显是非常离散的,因为是次方级别的,所以迭代次数不会多。

代码:

#include"stdio.h"
#include"algorithm"
#include"string.h"
#include"iostream"
#include"queue"
#include"map"
#include"vector"
#include"string"
#include"cmath"
using namespace std;
#define ll __int64
int ss[]= {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67};
ll n;
int r;
int used[22];
ll dfs(int ii,int x,int k,int tep,double kx)
{
    if(x==k)
    {
        return (int)(pow(kx+0.5,1.0/tep)-1); //注意+0.5控制精度!
    }
    if(tep>63) return 0;
    ll ans=0;
    for(int i=ii+1; i<18; i++)
    {
        if(ss[i]>r || tep*ss[i]>63) break;
        if(used[i]==0)
        {
            used[i]=1;
            ans+=dfs(i,x+1,k,tep*ss[i],kx);
            used[i]=0;
        }
    }
    return ans;
}
ll fun(ll x)
{
    ll ans=0;
    for(int i=1; i<5; i++)
    {
        memset(used,0,sizeof(used));
        if(i%2) ans+=dfs(-1,0,i,1,x*1.0);
        else ans-=dfs(-1,0,i,1,x*1.0);
    }
    return x-(ans+1);
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        scanf("%I64d%d",&n,&r);
        ll ans=n;
        while(1)
        {
            ll tep=fun(ans);
            if(tep==n) break;
            ans+=n-tep;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 18:22:24

[多校2015.01.1010 容斥+迭代] hdu 5297 Y sequence的相关文章

HDU 5297 Y sequence 容斥/迭代

Y sequence Problem Description Yellowstar likes integers so much that he listed all positive integers in ascending order,but he hates those numbers which can be written as a^b (a, b are positive integers,2<=b<=r),so he removed them all.Yellowstar ca

[2015hdu多校联赛补题]hdu 5297 Y sequence

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5297 题意:给你一个所有正整数的序列,然后去掉满足x^(2~r)的所有数(x为所有正整数,r>=2题目给出),问你现在这个序列的第n个数是什么 解:首先想到写一个函数func(y),它可以计算出给定数字y是序列中第几个数,这样我们大概可以二分答案~(事实上会TLE,得用迭代法,当然迭代的话也是用这个函数) 那么如何实现func: 首先想去掉满足x^2的所有数,我们可以用pow(y, 1/2)计算出y

hdu 5297 Y sequence(容斥)

题目链接:hdu 5297 Y sequence 考虑62以内的指数,x为奇数个质数因子,就减掉,偶数个加上.计算x为指数的不满足数直接pow(n,1/x)即可. #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <algorithm> using namespace std; type

【容斥】 HDU 2204 Eddy&#39;s爱好

通道 题意:给你一个正整数N,确定在1到N之间有多少个可以表示成M^K(K>1)的数. 思路:我们可以由n^(1/p),知道指数为p的有多少个数. 通过观察,可以发现若一个数可以表示成x^(k*t),则可以表示成(x^k)^t.因此指数必然为素数. 枚举素数便可以得到指数为p的个数,但是可能出现重复,例如:x^3=y^5,其中x=t^5,y=t^3. 运用容斥原理,设a[i]表示指数为第i个素数的个数,那么答案等于满足一个的,减去两个的,加上三个的…… 由于2^60>10^18,2*3*5*7

HDU 5297(Y sequence-Mobius函数容斥+迭代)

Y sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1192    Accepted Submission(s): 265 Problem Description Yellowstar likes integers so much that he listed all positive integers in asce

[多校2015.01.1012 博弈] hdu 5299 Circles Game

题意: 在无限大的平面内给你n个圆,两个圆之间只可能是包含或者相离 A和B每次选择一个圆,删除这个圆连通它所包含的所有圆 谁不能选择圆删除了,谁就输了 思路: 所有圆可以构造成一棵树,然后按树上SG博弈来做就好了. 树的删边游戏 规则如下: 给出一个有 N 个点的树,有一个点作为树的根节点. 游戏者轮流从树中删去边,删去一条边后,不与根节点相连的部分将被移走. 谁无路可走谁输. 我们有如下定理: [定理] 叶子节点的 SG 值为 0; 中间节点的 SG 值为它的所有子节点的 SG 值加 1 后的

[多校2015.01.1002 单调队列] hdu 5289 Assignment

题意: 给你n个人和一个k 问你把这n个人分成多少个连续的子区间,要求区间每个数两两相差绝对值小于k 思路: 我们仅仅只需要对于当前位置,最左边那个和它绝对值相差大于等于k 的位置在哪 假设对于i这个位置,最左边的位置是tep,不存在的话tep=0 那么当且位置的贡献就是 sum[i]=min(i-tep,sum[i-1]+1); 那么对于这个位置怎么求的话,我是使用了两个单调队列 第一次维护递增的,第二次维护递减的. 每次先把不满足的点全部出队,然后记录最大的下标 然后入队 代码: #incl

[多校2015.02.1006 高斯消元] hdu 5305 Friends

题意: 给你n个人m条关系 每条关系包括a,b 代表a和b能够是线上朋友也能够是线下朋友 然后保证每一个人的线上朋友数和线下朋友数相等 问你有多少种组成方法 思路: 官方题解是爆搜+剪枝,然而并不会写. . 比赛的时候想到用高斯消元来剪枝 最后枚举自由元 由于关系的话到了最后肯定有些关系是确定的. 这样一定会消掉一些部分 最后G++AC C++TLE. . 代码: #include"cstdlib" #include"cstdio" #include"cs

[min-max容斥][dfs] Hdu P4336 Card Collector

Problem Description In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, for example, if you collect all the 108 people in the famous novel Water Margin, you will win an amazing award. As a smart boy, you