题目大意

  这是一道通信题。

  给你 \(8\) 个 \(32\) 位整数。加密端要把这些数加密成至少 \(1000\) 个 \(32\) 位整数,交互库会把这些整数随机打乱后发给解密端,解密端最多能获得其中 \(lim\) 个的值,解密端要按顺序给出这 \(8\) 个整数。

  交互库会测试 \(100\) 次。

  对于 \(lim\geq 50\) 的测试点,要求 \(100\%\) 的正确率。

  对于 \(lim\geq 20\) 的测试点,要求 \(90\%\) 的正确率。

  对于 \(lim\geq 17\) 的测试点,要求 \(50\%\) 的正确率。

题解

解法一

  先把这些数拆成 \(16\) 个 \(16\) 位整数。

  然后每次随机选一些数异或到一起,前 \(16\) 位为这些数的异或值,后 \(16\) 位为选了那些数。

  解密端随机 \(lim\) 个数,求出这些数能不能解出原来的 \(16\) 个数。

  如果 \(lim\times 16\) 的矩阵满秩就能求出。

  \(17\times 16\) 的矩阵满秩的概率约为 \(58\%\)。

  \(20\times 16\) 的矩阵满秩的概率约为 \(94\%\)。

  \(50\times 16\) 的矩阵满秩的概率约为 \(100\%\)。

解法二

  还是先把这些数拆成 \(16\) 个 \(16\) 位整数,记为 \(a_0,a_1,\ldots,a_{15}\)。

  记 \(f(x)=\sum_{i=0}^{15}a_ix^i\)。

  取一个合适大小的整数 \(p\)。

  对于 \(0\leq i<1000\),返回 \(i+(f(i)\bmod p)\times 1000\)。

  解密端随便选 \(16\) 个数就能插值插出 \(a_0,a_1,\ldots,a_{15}\)。

  正确率为 \(100\%\)。

代码

解法一

#include<vector>
#include<algorithm>
using namespace std;
vector<int>encode(vector<int>arr,int lim)
{
static unsigned a[100];
for(int i=0;i<16;i++)
a[i]=0;
for(int i=0;i<8;i++)
{
unsigned v=arr[i];
a[i*2]=v&((1<<16)-1);
a[i*2+1]=v>>16;
}
for(int i=0;i<16;i++)
a[i]|=1<<(i+16);
vector<int>vec;
for(int i=0;i<1<<16;i++)
{
unsigned s=0;
for(int j=0;j<16;j++)
if((i>>j)&1)
s^=a[j];
vec.push_back(s);
}
return vec;
}
static unsigned seed=1932532;
static unsigned get()
{
seed^=seed<<13;
seed^=seed>>17;
seed^=seed<<5;
return seed;
}
vector<int>decode(int(*const arr)(int),int n,int lim){
static unsigned a[100],b[1000000],c[1000000];
for(int i=0;i<1<<16;i++)
c[i]=i;
for(int i=0;i<1<<16;i++)
{
int y=get()%(i+1);
if(y!=i)
swap(c[i],c[y]);
}
for(int i=0;i<lim;i++)
b[i]=arr(c[i]);
vector<int>vec;
for(int i=0;i<16;i++)
{
int x=lim;
for(int j=i;j<lim;j++)
if(b[j]&(1<<(16+i)))
{
x=j;
break;
}
if(x>=lim)
{
for(int i=0;i<8;i++)
vec.push_back(0);
return vec;
}
if(x!=i)
swap(b[x],b[i]);
for(int j=0;j<lim;j++)
if(j!=i&&(b[j]&(1<<(16+i))))
b[j]^=b[i];
}
for(int i=0;i<16;i++)
b[i]&=(1<<16)-1;
for(int i=0;i<8;i++)
vec.push_back((b[i*2+1]<<16)|b[i*2]);
return vec;
}

解法二

#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
static const ll p=100003;
vector<int>encode(vector<int>arr,int lim)
{
static unsigned a[100];
for(int i=0;i<16;i++)
a[i]=0;
for(int i=0;i<8;i++)
{
unsigned v=arr[i];
a[i*2]=v&((1<<16)-1);
a[i*2+1]=v>>16;
}
vector<int> vec;
for(int i=0;i<1000;i++)
{
ll s=0;
for(int j=15;j>=0;j--)
s=(s*i+a[j])%p;
vec.push_back(i+s*1000);
}
return vec;
}
static ll fp(ll a,ll b)
{
ll s=1;
for(;b;b>>=1,a=a*a%p)
if(b&1)
s=s*a%p;
return s;
}
vector<int>decode(int(*const arr)(int),int n,int lim){
static unsigned a[100],b[100];
static ll x[1000],y[1000],ans[1000],e[1000];
for(int i=0;i<16;i++)
{
b[i]=arr(i);
x[i]=b[i]%1000;
y[i]=b[i]/1000;
}
for(int i=0;i<16;i++)
ans[i]=0;
for(int i=0;i<16;i++)
{
for(int j=0;j<16;j++)
e[j]=0;
e[0]=1;
for(int j=0;j<16;j++)
if(j!=i)
{
for(int k=15;k>=0;k--)
{
e[k+1]=(e[k+1]+e[k])%p;
e[k]=-e[k]*x[j]%p;
}
}
ll s=y[i];
for(int j=0;j<16;j++)
if(j!=i)
s=s*fp(x[i]-x[j],p-2)%p;
for(int j=0;j<16;j++)
{
e[j]=e[j]*s%p;
ans[j]=(ans[j]+e[j])%p;
}
}
for(int i=0;i<16;i++)
a[i]=(ans[i]+p)%p;
vector<int>vec;
for(int i=0;i<8;i++)
vec.push_back((a[i*2+1]<<16)|a[i*2]);
return vec;
}

【XSY3309】Dreamweaver 高斯消元 拉格朗日插值的更多相关文章

  1. BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值

    传送门 题面图片真是大到离谱-- 题目要求的是 \(\begin{align*}\sum\limits_{i=1}^N i^d[gcd(i,n) == 1] &= \sum\limits_{i ...

  2. UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...

  3. CF917D Stranger Trees【矩阵树定理,高斯消元】

    题目链接:洛谷 题目大意:给定一个$n$个节点的树$T$,令$ans_k=\sum_{T'}[|T\cap T'|=k]$,即有$k$条边重合.输出$ans_0,ans_1,\ldots,ans_{n ...

  4. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  5. 【BZOJ-3270】博物馆 高斯消元 + 概率期望

    3270: 博物馆 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 292  Solved: 158[Submit][Status][Discuss] ...

  6. *POJ 1222 高斯消元

    EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9612   Accepted: 62 ...

  7. [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...

  8. hihoCoder 1196 高斯消元·二

    Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...

  9. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

随机推荐

  1. DSAPI官方QQ群

    DSAPI官方QQ群  请加主群,若主群成员已满,请加分群. 群内除常规的.NET技术交流外,也负责DSAPI的使用技术支持和更新通知.   『VB.NET/C#编程』主群              ...

  2. [转]Blue Prism VBO Cheat Sheet

    本文转自:https://www.cheatography.com/ethanium/cheat-sheets/blue-prism-vbo/ Blue Prism MAPIEx Configure ...

  3. MVC,EF 小小封装

    1.项目中经常要用到 EF,有时候大多数的增删改查都是重复性的东西,本次封装就是为了快速开发,期间没有考虑到架构上的各种思想,就感觉到欠缺点什么东西所以这次将这些拉出来,有存在问题的话还请各位多多指导 ...

  4. Linux高级运维 第五章 Vim编辑器和恢复ext4下误删除的文件-Xmanager工具

    5.1  vim主要模式介绍,vim命令模式. 确保系统已经安装了VIM工具 [root@panda ~]# rpm -qf `which vim` [root@panda ~]# rpm -qf ` ...

  5. Centos 7.6搭建Tomcat 环境,发布Java项目

    安装 JDK Tomcat 的安装依赖 JDK,在安装 Tomcat 之前需要先安装 Java JDK.输入命令 java -version,如果显示 JDK 版本,证明已经安装了 JDK java ...

  6. .net工作流引擎ccflow新增支持PostgreSQL数据库的功能的发布说明

    关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎  java工作流引擎. 各位驰骋工作流引擎爱好着,经过驰骋公司与正元公司的共同努力,ccflow支持Post ...

  7. jsp:set/getProperty底层实现的探究

    关于jsp:set/getProperty底层实现的探究 今天上课讲到<jsp:useBean>时涉及到了<jsp:setProperty>和<jsp:getProper ...

  8. Java关于字符串工具类~持续汇总~

    /** * 01 * 描述:String的substring和replace方法使用 * [时间 2019年3月5日下午3:22:08 作者 陶攀峰] */ public static void te ...

  9. jQuery字母大小写转换函数

    toLowerCase() ------ 将字符串中的所有字符都转换成小写: toUpperCase() ------ 将字符串中的所有字符都转换成大写:

  10. python中os模块和sys模块的常见用法

    OS模块的常见用法 os.remove()   删除文件 os.rename()   重命名文件 os.walk()    生成目录树下的所有文件名 os.chdir()    改变目录 os.mkd ...