惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
J
Java Code Geeks
量子位
腾讯CDC
C
Check Point Blog
小众软件
小众软件
IT之家
IT之家
I
InfoQ
Hugging Face - Blog
Hugging Face - Blog
Stack Overflow Blog
Stack Overflow Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
GbyAI
GbyAI
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
博客园_首页
S
SegmentFault 最新的问题
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
Martin Fowler
Martin Fowler

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
洛谷-P9165 「INOH」Round 1 - 意外 题解
xiaoniu14285 · 2026-04-28 · via 博客园_首页

Solution

由题意得,传输的数组长度必须 \(\le 750\)

最朴素的容错方式是增加冗余。假设需要传递 \(S\) 个数值,每个数值重复传输 \(K=\left\lfloor\frac{750}{S}\right\rfloor\) 份。由于模数大,篡改后的数可以认为各不相同。所以在 \(K\) 份中只要正确的数字保留了 \(\ge 2\) 份,就能通过取众数还原,否则该数值丢失。因此单个数成功概率为:

\[1-\frac{\binom{K}{0}+\binom{K}{1}}{2^K}=1-\frac{1+K}{2^K} \]

最直接的想法是直接传原数组,每个数传 \(7\) 份。这样单个数成功概率为 \(0.9375\),但是需要 \(100\) 个数全部成功才行,总成功率为 \(0.9375^{100}\approx0\),没有前途。

能否找到一种方法,使得只需要任意 \(100\) 个有效数值就能反推原数组?不妨考虑多项式表示法

有两种构造多项式的方法:

  1. 数组作为点值:解码器需要做 \(N\)\(O(N^2)\) 插值,总时间复杂度 \(O(N^3)\)
  2. 数组作为系数:拉格朗日插值提供了 \(O(N^2)\) 的点值转系数算法。

综上,我们采用方法 2。

\(S=150\)\(K=5\),期望接收到 \(\approx121\) 个有效点,成功率较高。

Code

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i(a);i<b;++i)
#define per(i,a,b) for(int i(a);i>b;--i)
#define rept(i,a,b) for(int i(a);i<=b;++i)
#define pert(i,a,b) for(int i(a);i>=b;--i)
#define ll long long
#define eb emplace_back
using namespace std;
const int N=100,S=150,K=5;
const ll P=998244353;
ll ksm(ll x,ll y){
    ll res=1;
    while(y){
        if(y&1) (res*=x)%=P;
        (x*=x)%=P,y>>=1;
    }
    return res;
}
vector<int> Encode(vector<int> vec){
    vector<int> res;
    res.reserve(S*K);
    rept(x,1,S){
        ll y=0;
        pert(i,N-1,0) y=(y*x+vec[i])%P;
        rep(i,0,K) res.eb(y);
    }
    return res;
}
vector<ll> lagrange(const vector<ll> &x,const vector<ll> &y){
    int n=x.size();
    vector<ll> p(n+1,0),q(n+1,0),res(n,0);
    p[0]=1;
    rep(i,0,n){
        pert(j,i,0){
            (p[j+1]+=p[j])%=P;
            (p[j]*=-x[i])%=P;
        }
    }
    rep(i,0,n){
        ll a=1,rem=p[n];
        rep(j,0,n) if(i^j) (a*=x[i]-x[j])%=P;
        a=ksm(a,P-2)*y[i]%P;
        pert(j,n-1,0){
            q[j]=rem;
            (rem=p[j]+rem*x[i]%P)%=P;
        }
        rep(j,0,n) (res[j]+=a*q[j]%P)%=P;
    }
    rep(i,0,n) (res[i]+=P)%=P;
    return res;
}
vector<int> Decode(vector<int> vec){
    vector<ll> x,y;
    x.reserve(N),y.reserve(N);
    rept(i,1,S){
        map<int,int> mp;
        rep(j,K*(i-1),K*i){
            ++mp[vec[j]];
            if(mp[vec[j]]>=2){
                x.eb(i),y.eb(vec[j]);
                break;
            }
        }
        if(x.size()>=N) break;
    }
    vector<ll> res=lagrange(x,y);
    return vector<int>(res.begin(),res.end());
}