【CF995F】Cowmpany Cowmpensation(动态规划,拉格朗日插值)

本文介绍了一道名为“CowmpanyCowmpensation”的编程题的解决方案,该题涉及多项式插值算法。通过使用动态规划求解特定条件下的方案数,并结合多项式插值方法,最终实现了对任意颜色数量的方案计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【CF995F】Cowmpany Cowmpensation(多项式插值)

题面

洛谷
CF

题解

我们假装结果是一个关于\(D\)\(n\)次多项式,
那么,先\(dp\)暴力求解颜色数为\(0..n\)的所有方案数
这是一个\(O(n^2)\)\(dp\)
然后直接做多项式插值就好了,公式戳这里

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define MAX 3030
#define MOD 1000000007
inline int read()
{
    int x=0;bool t=false;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=true,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return t?-x:x;
}
int f[MAX][MAX],g[MAX],n,D;
struct Line{int v,next;}e[MAX];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
void dfs(int u)
{
    for(int j=1;j<=n;++j)f[u][j]=1;
    for(int i=h[u];i;i=e[i].next)
    {
        int v=e[i].v;dfs(v);
        for(int j=1;j<=n;++j)f[u][j]=1ll*f[u][j]*f[v][j]%MOD;
    }
    for(int i=1;i<=n;++i)f[u][i]=(f[u][i]+f[u][i-1])%MOD;
}
int fpow(int a,int b)
{
    int s=1;
    while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}
    return s;
}
int Calc(int x)
{
    int tmp=1,bs=(n&1)?-1:1,ret=0;
    if(x<=n)return f[1][x];
    for(int i=1;i<=n;++i)tmp=1ll*tmp*(x-i)%MOD;
    for(int i=1;i<=n;++i)tmp=1ll*tmp*fpow(i,MOD-2)%MOD;
    for(int i=0;i<=n;++i,bs=-bs)
    {
        int S=1ll*bs*f[1][i]*tmp%MOD;S=(S+MOD)%MOD;
        ret=(ret+S)%MOD;
        tmp=1ll*tmp*(x-i)%MOD*fpow(x-i-1,MOD-2)%MOD;
        tmp=1ll*tmp*(n-i)%MOD*fpow(i+1,MOD-2)%MOD;
    }
    return ret;
}
int main()
{
    n=read();D=read();
    for(int i=2;i<=n;++i)Add(read(),i);
    dfs(1);printf("%d\n",Calc(D));
    return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/9392585.html

docker build -t gdal-python:3.13 . Sending build context to Docker daemon 1.052GB Step 1/7 : FROM python3.13:v1 as python_builder ---> e89b7d3211ea Step 2/7 : RUN tar cf /usr_local.tar /usr/local ---> Running in 63a4a91ffc7b tar: Removing leading `/' from member names Removing intermediate container 63a4a91ffc7b ---> ab2f23058ebc Step 3/7 : FROM ids:latest ---> e8f8ac2879c6 Step 4/7 : COPY --from=python_builder /usr_local.tar / ---> 3f04634e9582 Step 5/7 : RUN tar xf /usr_local.tar -C / && rm /usr_local.tar ---> Running in 9b995f9b7f81 Removing intermediate container 9b995f9b7f81 ---> bcf71786a84c Step 6/7 : ENV PATH="/usr/local/bin:${PATH}" ---> Running in 32708b1eb1de Removing intermediate container 32708b1eb1de ---> af14a4ede536 Step 7/7 : RUN python --version ---> Running in 29beba0e2cd5 python: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by python) python: /lib64/libm.so.6: version `GLIBC_2.35' not found (required by /usr/local/bin/../lib/libpython3.13.so.1.0) python: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by /usr/local/bin/../lib/libpython3.13.so.1.0) python: /lib64/libc.so.6: version `GLIBC_2.33' not found (required by /usr/local/bin/../lib/libpython3.13.so.1.0) python: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by /usr/local/bin/../lib/libpython3.13.so.1.0) python: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by /usr/local/bin/../lib/libpython3.13.so.1.0) The command '/bin/sh -c python --version' returned a non-zero code: 1
最新发布
07-16
<think>我们遇到了一个Docker构建错误,错误信息显示Python需要更高版本的GLIBC(GNU C库)而当前系统提供的版本过低。 具体错误是: python: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by python) 以及其他几个GLIBC版本(2.35, 2.29, 2.33, 2.32)未找到。 原因分析: 1. 基础镜像`ids:latest`可能是一个较旧的操作系统(比如CentOS 7),其自带的GLIBC版本较低。 2. 而我们从`python_builder`(一个已经构建好的Python3.13镜像)中复制了`/usr/local`目录,这个目录包含了从源码编译的Python3.13,它依赖于较新的GLIBC版本。 解决方案: 1. 升级基础镜像:将`ids:latest`替换为一个更新的基础镜像,例如CentOS 8或Ubuntu 20.04以上,这些系统自带了更高版本的GLIBC。 2. 在现有基础镜像上手动升级GLIBC(不推荐,因为容易导致系统不稳定)。 3. 使用静态链接的Python解释器:重新编译Python,使其静态链接必要的库,避免依赖宿主系统的GLIBC版本。 4. 使用多阶段构建时,确保目标阶段的基础镜像构建阶段的基础镜像具有兼容的库版本。 考虑到安全性和稳定性,推荐使用第一种方法:更换基础镜像。 示例修改Dockerfile: ```dockerfile # 使用一个较新的基础镜像,例如Ubuntu 22.04(GLIBC版本>=2.35) FROM ubuntu:22.04 as base # 然后继续后续步骤... ``` 如果必须使用`ids:latest`(可能是某个定制镜像),则需要在该镜像中升级GLIBC,但这通常很复杂且风险高。 另一种思路:在构建Python时,使用较旧的版本(如Python3.9)可能对GLIBC的要求较低,或者使用官方Python镜像作为基础。 详细步骤(以更换基础镜像为例): 1. 确定当前`ids:latest`镜像的GLIBC版本,可以运行: ```bash docker run --rm ids:latest ldd --version ``` 2. 对比Python3.13所需的GLIBC版本(要求>=2.35?),如果当前基础镜像不满足,则更换。 修改后的Dockerfile示例: ```dockerfile # 使用一个已知GLIBC版本较高的基础镜像 FROM ubuntu:22.04 # 然后复制之前构建的Python环境(注意:这里假设之前构建的Python环境Ubuntu22.04兼容) COPY --from=python_builder /usr_local.tar / RUN tar xf /usr_local.tar -C / && \ rm /usr_local.tar ENV PATH="/usr/local/bin:${PATH}" RUN python --version ``` 注意:如果之前构建Python的环境(`python_builder`)也是在一个低GLIBC的系统上构建的,那么它可能仍然无法在高GLIBC的系统上运行(因为编译时链接的库版本可能不兼容)。因此,最可靠的方法是整个构建过程都在新的基础镜像上进行。 如果问题依旧,可能需要重新构建Python,使其目标系统兼容。 针对当前错误,我们还可以尝试: 1. 在目标镜像中安装高版本的GLIBC(风险高,不推荐在生产环境使用) 2. 使用官方Python镜像作为基础镜像,避免自己编译Python。 推荐使用官方Python镜像: ```dockerfile FROM python:3.13-rc-slim # 然后在此基础上安装ids所需的组件 ``` 由于问题描述中使用了多阶段构建,且第一阶段已经构建了Python,所以这里我们选择更换基础镜像为高版本GLIBC的系统。 如果必须坚持使用`ids:latest`,那么需要升级该镜像的GLIBC,但这是非常危险的操作,可能导致系统崩溃。因此,我们建议联系镜像维护者更新基础镜像。 最后,运行`python --version`来验证。 如果更换基础镜像后仍然出现同样的问题,则可能是由于复制的Python构建是在一个低GLIBC系统上构建的,而高GLIBC系统无法向后兼容。因此,需要确保Python是在一个目标系统GLIBC版本兼容的系统上构建的。 更安全的做法:将第一阶段(python_builder)也基于新的基础镜像(如ubuntu:22.04)来构建Python。 总结步骤: 1. 构建第一阶段(python_builder)时,使用一个具有高版本GLIBC的基础镜像(如ubuntu:22.04)来编译安装Python3.13。 2. 第二阶段(最终镜像)也使用相同的基础镜像(或同样高版本GLIBC的镜像)。 这样就能保证两个阶段的GLIBC版本一致。 修改后的完整Dockerfile示例: ```dockerfile # 第一阶段:构建Python环境 FROM ubuntu:22.04 as python_builder # 在ubuntu:22.04中安装编译Python所需的依赖 RUN apt update && apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget # 下载并编译Python3.13 RUN wget https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz && \ tar -xf Python-3.13.0.tgz && \ cd Python-3.13.0 && \ ./configure --enable-optimizations && \ make -j $(nproc) && \ make altinstall # 将安装的Python打包(注意:这里安装到了/usr/local) RUN tar cf /usr_local.tar /usr/local # 第二阶段:使用同样高GLIBC的基础镜像 FROM ubuntu:22.04 # 复制Python环境 COPY --from=python_builder /usr_local.tar / RUN tar xf /usr_local.tar -C / && \ rm /usr_local.tar # 设置环境变量 ENV PATH="/usr/local/bin:${PATH}" # 验证 RUN python --version ``` 注意:上面的示例中使用了`make altinstall`,这不会覆盖系统自带的Python,然后我们打包了/usr/local目录,在第二阶段解压。这样就能保证Python运行在兼容的系统中。 如果仍然遇到问题,请检查构建环境的一致性。 因此,针对当前错误,我们主要需要解决GLIBC版本不匹配的问题,更换基础镜像是最佳实践。</think>### 解决 Docker 构建中 GLIBC 版本不兼容问题 您在构建 Docker 镜像时遇到的错误表明 Python 3.13 需要更高版本的 GLIBC(GNU C 库),而您的基础镜像 `ids:latest` 提供的 GLIBC 版本过低。以下是详细分析和解决方案: #### 错误原因分析 ``` python: /lib64/libc.so.6: version `GLIBC_2.34' not found python: /lib64/libm.so.6: version `GLIBC_2.35' not found ``` - **核心问题**:Python 3.13 编译时链接了较新的 GLIBC 版本(2.34+),而目标镜像 `ids:latest` 使用的是较旧的 GLIBC(可能 ≤2.28) - **根本原因**:多阶段构建中,构建阶段(`python3.13:v1`)和目标阶段(`ids:latest`)的底层 C 库不兼容 #### 解决方案 ##### 方法1:升级目标基础镜像(推荐) ```dockerfile # 修改前 FROM ids:latest # 修改后 - 使用更新的基础镜像 FROM debian:bookworm-slim # 或 ubuntu:22.04 ``` ##### 方法2:在目标镜像中编译安装兼容的 Python ```dockerfile FROM ids:latest # 安装编译依赖 RUN yum install -y gcc make zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel # 下载并编译 Python 3.13 RUN curl -O https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz && \ tar xzf Python-3.13.0.tgz && \ cd Python-3.13.0 && \ ./configure --enable-optimizations && \ make altinstall && \ cd .. && \ rm -rf Python-3.13.0* # 验证安装 RUN python3.13 --version ``` ##### 方法3:使用静态链接的 Python 构建(高级) ```dockerfile # 第一阶段:构建静态链接的 Python FROM python:3.13-alpine as builder RUN apk add --no-cache build-base zlib-dev RUN wget https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz && \ tar xzf Python-3.13.0.tgz && \ cd Python-3.13.0 && \ ./configure --enable-shared=no --prefix=/opt/python-static && \ make && make install # 第二阶段:复制到目标镜像 FROM ids:latest COPY --from=builder /opt/python-static /opt/python-static ENV PATH="/opt/python-static/bin:${PATH}" ``` #### 验证修复 ```bash docker build -t fixed-python-image . docker run --rm fixed-python-image python --version # 应输出: Python 3.13.0 ``` ### 关键注意事项 1. **GLIBC 版本检查**: ```bash docker run --rm ids:latest ldd --version ``` 2. **Python 兼容性**: - Python 3.13 需要 GLIBC ≥ 2.28(推荐 ≥ 2.35) - 较旧系统(如 CentOS 7)最高支持 Python 3.9 3. **备选方案**: - 使用旧版 Python(如 3.9) - 考虑 PyPy 或 Conda 发行版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值