首页 > 其他分享 >2023 Jiangsu Collegiate Programming Contest, National Invitational of CCPC (Hunan) E. LCM Plus(容斥原理)

2023 Jiangsu Collegiate Programming Contest, National Invitational of CCPC (Hunan) E. LCM Plus(容斥原理)

时间:2024-06-20 20:32:34浏览次数:10  
标签:Jiangsu lcm Hunan int up include LCM dp gcd

题目

思路来源

乱搞ac

题解

枚举gcd,gcd一定是x的因子,

由于lcm+gcd=x,有lcm/gcd+1=x/gcd,还有lcm/gcd>=1

枚举lcm/gcd=y,

显然如果gcd>1,让gcd和lcm同除以gcd即可,所以可以认为gcd=1,

问题转化为,大小为k的集合,k个不同的数,满足gcd=1,且lcm=y的方案数,

然后写了个大暴力容斥,没想到过了…

dp[i][S]表示约数里当前选了i个数,当前所有质因子的状态有没有覆盖住最高幂次,

第j个质因子覆盖住了最高幂次就是1,否则就是0

但是,这个只能限制住lcm的限制,不能限制住gcd=1,所以容斥

用gcd=1的,减去gcd>1的,枚举大于1的具体是几,

比如需要减去的是gcd=2,lcm=y的方案,就等价于减去gcd=1,lcm=y/2的方案

减去所有大于的就正好是等于的了

代码

//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<queue>
#include<set>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back    
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;
typedef long long ll;
const int N=1e6+5,M=2e6+10,mod=1e9+7;
int x,k,ans;
struct Factor{
    typedef long long ll;
    static const int N=2304;// https://oeis.org/A066150
    int p[N],num[N],d[N],st[N],up[N],c;
    ll v[N];
    map<int,int>fac;
    Factor(){
        init();
    }
    void init(){
        c=0;
        fac.clear();
    }
    // 质因数分解,视情况可以换为pollard_pho
    void cal_f(int x){
        for(int i=2;1ll*i*i<=x;++i){
            while(x%i==0)x/=i,fac[i]++;
        }
        if(x>1)fac[x]++;
    }
    // x=prod{v in x},获取x的每个质因子值p,出现个数num
    void get_p(int v){
        cal_f(v);
        for(auto &w:fac){
            p[c]=w.first;
            num[c]=w.second;
            up[c]=1;
            rep(i,1,num[c])up[c]*=p[c];
            //printf("c:%d p:%d num:%d up:%d\n",c,p[c],num[c],up[c]);
            c++;
        }
    }
    // x=prod{v in x}, 获取x的每个因子值v,因子个数前缀积d
    void get_d(int x){
        //printf("x:%d\n",x);
        get_p(x);
        v[0]=d[0]=1;
        st[0]=0;
        for(int i=0;i<c;++i){
            d[i+1]=d[i]*(num[i]+1);
            for(int j=d[i];j<d[i+1];++j){
                v[j]=v[j-d[i]]*p[i];
                st[j]=st[j-d[i]];
                if(v[j]%up[i]==0)st[j]|=(1<<i);
            }
        }
    }
};
vector<int>f;
map<int,int>mp;
void add(int &x,int y){
    x=(x+y)%mod;
}
int sol(int w){
    if(mp.count(w))return mp[w];
    Factor g;
    g.get_d(w);
    int c=g.c,tot=g.d[c];
    if(tot<k)return mp[w]=0;
    int up=(1<<c)-1,res=0;
    vector<vector<int>>dp(k+2,vector<int>(up+5,0));
    dp[0][0]=1;
    for(int i=0;i<tot;++i){
        for(int j=k-1;j>=0;--j){
            for(int x=up;x>=0;--x){
                add(dp[j+1][x|g.st[i]],dp[j][x]);
            }
        }
    }
    res=dp[k][up];
    //printf("w:%d\n",w);
    for(int i=0;i<tot;++i){
        if(g.v[i]==1)continue;
        res=(res-sol(w/g.v[i])%mod)%mod;
        res=(res+mod)%mod;
    }
    //;printf("w:%d res:%d\n",w,res);
    return mp[w]=res;
}
int main(){
    sci(x),sci(k);
    for(ll i=1;i*i<=x;++i){
        if(x%i==0){
            f.pb(i);
            if(x/i!=i)f.pb(x/i);
        }
    }
    for(auto &g:f){
        int w=x/g-1;
        if(w<=0)continue;
        add(ans,sol(w));
    }
    pte(ans);
    return 0;
}

标签:Jiangsu,lcm,Hunan,int,up,include,LCM,dp,gcd
From: https://blog.csdn.net/Code92007/article/details/139837988

相关文章

  • Diffusers代码学习:LCM 图生图
    要将LCM用于图像到图像,需要将支持的LCM模型的Checkpoint加载到[UNet2DConditionModel]中,并用[LCMscheduler]替换scheduler程序。然后,可以像往常一样使用管道,并传递文本提示和初始图像,只需4个步骤即可生成图像。# 以下代码为程序运行进行设置importosos.environ["HF_ENDP......
  • SQLCMD 密码中的 K8S 秘密用法始终为空
    我试图使用K8Ssecret密码连接到SQL服务器,但无论我使用什么语法或方法,密码总是空的。如果我硬编码密码,则一切正常。我还可以使用此命令在POD中打印密码,它还会返回存储在密码中的密码,因此POD可以实际访问密码。kubectlexec-itpodname--printenvMSS......
  • 如何用潜类别混合效应模型(Latent Class Mixed Model ,LCMM)分析老年痴呆年龄数据|附
    全文下载链接:http://tecdat.cn/?p=24647最近我们被客户要求撰写关于LCMM的研究报告,包括一些图形和统计输出。线性混合模型假设N个受试者的群体是同质的,并且在群体水平上由独特的曲线Xi(t)β描述。背景和定义相比之下,潜在类别混合模型在于假设人口是异质的,并且由G潜在类......
  • 最大公约数(gcd())和最小公倍数(lcm())的c语言和c++详细解法
    最大公约数(gcd())和最小公倍数(lcm())最大公约数:定义:两个或多个整数共有的约数中最大的一个。例如:整数12和18,他们的公约数有1、2、3、6,其中最大的公约数是6。c语言解法:辗转相除法和更相减损法1、辗转相除法:思路:先求解较大的数除以较小的数的余数,再用较小的数除以前......
  • 【VMware vSphere】安装配置Update Manager Download Service(UMDS)作为 vLCM 的下载存
    VMwarevSphereUpdateManagerDownloadService(UMDS)是vSphereLifecycleManager(vLCM)的可选模块。我在之前文章中提到这个功能,当vSphere环境能够连接Internet时,我们可以使用vLCM的在线Internet下载源获取修补程序,当vSphere环境不能连接Internet时,您可以在您的......
  • 【VMware vSphere】使用vSphere Lifecycle Manager(vLCM)管理独立主机和集群的生命周期
    vSphereLifecycleManager(vLCM)是vSphere7中引入的一项新功能,它提供了一种集中式、自动化和简单性的方式来管理和升级vSphere基础架构组件(如vCenter、ESXi主机和NSX)的生命周期。VMware早期用于vSphere升级和补丁管理的解决方案称为vSphereUpdateManager(VUM),这对管理员用......
  • 2024 江苏省大学生程序设计大赛 2024 Jiangsu Collegiate Programming Contest(FGKI)
    题目来源:https://codeforces.com/gym/105161文章目录F-DownloadSpeedMonitor题意思路编程G-DownloadTimeMonitor题意思路编程K-NumberDeletionGame题意思路编程I-IntegerReaction题意思路编程写在前面:今天打的训练赛打的很水·····,我发现我们......
  • Nikita and LCM题解
    题目大意给你一个数组$a$,令$t$为$a$的子序列且$t$中所有数的最小公倍数$\notina$求$t$数组中最多有多少个数。思路非常明显这是一道数学题,对于数组$a$我们首先从小到大拍一个序,然后我们可以求出$a$中所有数的最大公倍数,如果这个公倍数$\not=......
  • C. Nikita and LCM
    原题链接题解发现一串数字的lcm一定大于等于这一串数字的最大值,所以如果整个数组的lcm大于\(a_{max}\),直接输出n否则,注意这里的思维,否则,剩余数字组成的lcm一定小于等于\(a_{max}\)且是\(a_{max}\)的因子code#include<bits/stdc++.h>#definelllonglongusingnamesp......
  • 重排模型DLCM
    论文名:LearningaDeepListwiseContextModelforRankingRefinement背景在搜索场景下,给定一个查询q,q和d特征的向量表示x(q,d),rank阶段的loss可以表示为:其中:Q是query的集合,D是doc集合,f是rank模型函数可以看到,传统的rank模型是一种point-wise的建模方法,没有考虑不同doc之间......