hdu 5297 Y sequence 容斥+迭代

本文介绍了一道名为Ysequence的问题解决思路,该问题要求找出特定数列中第n项的值。文章详细阐述了如何通过容斥原理与迭代法相结合的方法来高效求解这一问题,并提供了完整的C++代码实现。

hdu 5297 Y sequence 容斥+迭代

题目链接:hdu 5297
题意:定义数列A为不能被表示成pow(a,b)(a>0,2<=b<=r)的正整数的升序排列。求A(n)。(0<n<2*1e18,2<=r<=62。)
思路:

思路主要分为两个部分:
首先,先求A(n)的反函数,最基本的思想是把n开次方直接取整去掉,但是由于会产生重排,所以要用容斥去搞,我的做法是先利用莫比乌斯反演预处理出容斥的系数。
之后,外层的做法:由于不合法的数非常少,所以可以直接进行迭代求解。

上代码(虽然比较丑:

#include <cmath>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
long long n;
int r;
const long long INF=0x7fffffffffffffff;
const int M=100000;
const int N=63;
const double eps=1e-7;
long long biao[64][M];


int prime[N];
int tt=0;
void get_prime(){
    bool is_prime[N];
    for(int i=1;i<N;i++)is_prime[i]=true;
    for(int i=2;i<N;i++)
        for(int j=i*i;j<N;j+=i)
            is_prime[j]=false;
    for(int i=1;i<N;i++)if(is_prime[i])
        prime[tt++]=i;
}
bool haha[63][63];
void get(int r){
    for(int i=0;prime[i]<=r;i++){
        haha[r][1]=1;
        for(int j=0;prime[j]<=r;j++){
            for(int k=1;k<N;k++){
                if(haha[r][k]&&k*prime[j]<N){
                    haha[r][k*prime[j]]=1;
                }
            }
        }
    }
}

void prepare(){
    get_prime();
    memset(haha,0,sizeof(haha));
    for(int i=0;i<N;i++){get(i);}
    for(int i=0;i<M;i++)biao[0][i]=1;
    for(int i=1;i<N;i++){
        for(int j=1;j<M;j++){
            if(biao[i-1][j]<INF/j)
            biao[i][j]=biao[i-1][j]*j;
            else biao[i][j]=INF;
          //  cout<<j<<" "<<i<<" "<<biao[i][j]<<endl;
        }
    }
}


int mu[N+10];


int hehe[100],tot=0;
void get_mu(){
    mu[1]=1;

    for(int i=1;i<=N;i++)
    for(int j=i+i;j<=N;j+=i){
        mu[j]-=mu[i];
    }
    for(int i=2;i<N;i++)
    {
        if(mu[i]!=0){
            hehe[tot++]=i;
        }
    }
}
int kgh(long long a,int b){
    if(b==2)return (int)(sqrt(a)+eps);
    else if(b==3) return (int)(pow(a,1.0/3)+eps);
    int l=1,h=14,mid;
    if(b==5) h=10000;
    if(b==6) h=5000;
    if(b==7) h=500;
    if(b==10) h=73;
    if(b==11) h=50;
    if(b==12) h=40;
    if(b==13) h=28;
    if(b==14) h=21;
    if(b==15) h=17;
    while(l<h){
        mid=(l+h)>>1;
        if(biao[b][mid]>a) h=mid;
        else l=mid+1;
    }
    return l-1;
}
int data[N][N];
long long ok(long long tp){
    int ans=0;
   for(int t=1;t<data[r][0];t++){
        int i=data[r][t];
        if(mu[i]==1) ans+=(kgh(tp,i)-1);
        else if(mu[i]==-1)ans-=(kgh(tp,i)-1);
    }
    return n-(tp-1+ans);
}
void pp(){
    for(int i=2;i<N;i++){
        data[i][0]=1;
        for(int j=2;j<N;j++){
            if(haha[i][j]&&mu[j]!=0){
                data[i][data[i][0]++]=j;
            }
        }
    }
}
int main(){
//    freopen("1010.in","r",stdin);
//    freopen("data1.out","w",stdout);
    int T;get_mu();
    prepare();
    pp();

   // cout<<kgh(INF/2,11)<<endl;
    scanf("%d",&T);
    long long l,h,mid;
    while(T--){
        scanf("%I64d%d",&n,&r);
        long long tp=ok(n),tn=n;
        while(tp){
            tn+=tp;
            tp=ok(tn);
        }
        printf("%I64d\n",tn);
    }
    return 0;
}
混合动力汽车(HEV)模型的Simscape模型(Matlab代码、Simulink仿真实现)内概要:本文档介绍了一个混合动力汽车(HEV)的Simscape模型,该模型通过Matlab代码和Simulink仿真工具实现,旨在对混合动力汽车的动力系统进行建模与仿真分析。模型涵盖了发动机、电机、电池、传动系统等关键部件,能够模拟车辆在不同工况下的能量流动与控制策略,适用于动力系统设计、能耗优化及控制算法验证等研究方向。文档还提及该资源属于一个涵盖多个科研领域的MATLAB仿真资源包,涉及电力系统、机器学习、路径规划、信号处理等多个技术方向,配套提供网盘下载链接,便于用户获取完整资源。; 适合人群:具备Matlab/Simulink使用基础的高校研究生、科研人员及从事新能源汽车系统仿真的工程技术人员。; 使用场景及目标:①开展混合动力汽车能量管理策略的研究与仿真验证;②学习基于Simscape的物理系统建模方法;③作为教学案例用于车辆工程或自动化相关课程的实践环节;④与其他优化算法(如智能优化、强化学习)结合,实现控制策略的优化设计。; 阅读建议:建议使用者先熟悉Matlab/Simulink及Simscape基础操作,结合文档中的模型结构逐步理解各模块功能,可在此基础上修改参数或替换控制算法以满足具体研究需求,同时推荐访问提供的网盘链接获取完整代码与示例文件以便深入学习与调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值