LibreOJ2045 - 「CQOI2016」密钥破解

本文详细介绍了如何使用Pollard's Rho算法分解大数N,其中N为两个质数p和q的乘积。通过该算法,我们可以在O(n^(1/4))的时间复杂度内找到N的一个因数,进而解决密钥破解问题。文章提供了算法的伪代码及C++实现,包括nxt(x)、PR(n)等关键函数。

Portal

Description

给出三个正整数\(e,N,c(\leq2^{62})\)。已知\(N\)能表示成\(p\cdot q\)的形式,其中\(p,q\)为质数。计算\(r=(p-1)(q-1),ed\equiv 1 \pmod r\),求\(c^d \bmod N\)

Solution

其实主要就是一件事:分解大数\(N\)。这里要用到一个叫做Pollard's Rho的算法,可以在约\(O(n^{\frac{1}{4}})\)的时间复杂度上求出一个\(n\)的因数。具体原理是生日悖论,但我不知道为什么这个是悖论...伪代码如下:

nxt(x)
    return (x*x+step) mod n
PR(n)
    while true
        step=rand()
        a=b=rand()
        while true
            a=nxt(a),b=nxt(nxt(b))
            if(a==b) break
            g=gcd(abs(a-b),n)
            if(g!=1) return g

由于\(nxt(x)\)是循环的,所以用以\(a\)的两倍速度前进的\(b\)进行判断,一旦\(a=b\)则说明出现环,尝试换一个参数\(step\)去随机。

Code

//「CQOI2016」密钥破解
#include <bits/stdc++.h>
typedef long long lint;
lint n;
int pr[10]={0,2,3,5,7,11,13,17};
lint multi(lint a,lint b){lint t=a*b-(lint)((long double)a*b/n+1e-8)*n;if(t<0)return t+n;return t;}
inline lint abs(lint x) {return x<0?-x:x;}
inline lint gcd(lint x,lint y) {return y?gcd(y,x%y):x;}
int step;
inline lint nxt(lint x) {return (multi(x,x)+step)%n;}
lint PR(lint n)
{
    while(true)
    {
        step=rand();
        lint a,b; a=b=rand();
        while(true)
        {
            a=nxt(a),b=nxt(nxt(b));
            if(a==b) break;
            lint g=gcd(abs(a-b),n);
            if(g!=1) return g;
        }
    }
}
inline void exgcd(lint a,lint &x,lint b,lint &y)
{
    if(b==0) {x=1,y=0; return;}
    lint x1,y1; exgcd(b,x1,a%b,y1);
    x=y1,y=x1-a/b*y1;
}
lint inv(lint a,lint m)
{
    lint x,y; exgcd(a,x,m,y);
    while(x<0) x+=m;
    return x;
}
lint pow(lint x,lint y)
{
    lint r=1,t=x;
    for(lint i=y;i;i>>=1,t=multi(t,t)) if(i&1) r=multi(r,t);
    return r;
}
int main()
{
    lint e,c;
    scanf("%lld%lld%lld",&e,&n,&c);
    lint p=0,q=0;
    for(int i=1;i<=7;i++) {if(n%pr[i]==0) p=pr[i],q=n/p; break;}
    if(!p) p=PR(n),q=n/p;
    lint d=inv(e,(p-1)*(q-1));
    printf("%lld %lld\n",d,pow(c,d));
    return 0;
}

转载于:https://www.cnblogs.com/VisJiao/p/LOJ2045.html

个人防护装备实例分割数据集 一、基础信息 • 数据集名称:个人防护装备实例分割数据集 • 图片数量: 训练集:4524张图片 • 训练集:4524张图片 • 分类类别: 手套(Gloves) 头盔(Helmet) 未戴手套(No-Gloves) 未戴头盔(No-Helmet) 未穿鞋(No-Shoes) 未穿背心(No-Vest) 鞋子(Shoes) 背心(Vest) • 手套(Gloves) • 头盔(Helmet) • 未戴手套(No-Gloves) • 未戴头盔(No-Helmet) • 未穿鞋(No-Shoes) • 未穿背心(No-Vest) • 鞋子(Shoes) • 背心(Vest) • 标注格式:YOLO格式,适用于实例分割任务,包含边界框或多边形坐标。 • 数据格式:图片数据,来源于监控或相关场景。 二、适用场景 • 工业安全监控系统开发:用于自动检测工人是否佩戴必要的个人防护装备,提升工作场所安全性,减少工伤风险。 • 智能安防应用:集成到监控系统中,实时分析视频流,识别PPE穿戴状态,辅助安全预警。 • 合规性自动化检查:在建筑、制造等行业,自动检查个人防护装备穿戴合规性,支持企业安全审计。 • 计算机视觉研究:支持实例分割、目标检测等算法在安全领域的创新研究,促进AI模型优化。 三、数据集优势 • 类别全面:覆盖8种常见个人防护装备及其缺失状态,提供丰富的检测场景,确保模型能处理各种实际情况。 • 标注精准:采用YOLO格式,每个实例都经过精细标注,边界框或多边形坐标准确,提升模型训练质量。 • 真实场景数据:数据来源于实际环境,增强模型在真实世界中的泛化能力和实用性。 • 兼容性强:YOLO格式便于与主流深度学习框架(如YOLO、PyTorch等)集成,支持快速部署和实验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值