SGU - 200 Cracking RSA 高斯消元

同余意义下的高斯消元解决几类常见的问题+例题 高斯消元法 以下高斯消元指的是列主元高斯消元法。 高斯消元法除了解浮点数线性方程,它还可以用于求矩阵的秩,求某些线性空间中的一组线性无关的基,解同余方程组。 求秩 SGU 200 Cracking RSA 题意: 给你m个正的整型数,这m个数的质因子仅来自前t个质数,求它们能组成多少完全平方数。(每个数最多选一次,且不能一个数都不选) Sample test(s) Input 阅读详情

题目:给你m个数,这m个数都是由前n个质数组成,让你从这m个数中选几个数出来,使得选出来的数的乘积是完全平方数。n<=100,m<=100

思路:每个数就选和不选2中选择,对每个质数列一个方程,求自由元个数data,答案为2^data-1(空集不算),答案是个大数,所以要用大数来算答案

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<list>
#include<numeric>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define PP puts("*********************");
template<class T> T f_abs(T a){ return a > 0 ? a : -a; }
template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
// 0x3f3f3f3f3f3f3f3f
// 0x3f3f3f3f

const int maxn=1e3+50;
bool isprime[maxn];
int prime[maxn],tol;
void make_prime(int n){
    for(int i=0;i<=n;i++)
        isprime[i]=true;
    isprime[0]=isprime[1]=false;
    tol=0;
    for(int i=2;i<=n;i++){
        if(isprime[i])
            prime[tol++]=i;
        for(int j=0;j<tol;j++){
            if(i*prime[j]<=n)
                isprime[i*prime[j]]=false;
            else
                break;
            if(i%prime[j]==0)
                break;
        }
    }
}
const int MAXN = 105;
//有equ个方程,var个变元。增广矩阵行数为equ,列数为var+1,分别为0到var
int equ,var;
int a[MAXN][MAXN]; //增广矩阵
int x[MAXN]; //解集
int free_x[MAXN];//用来存储自由变元(多解枚举自由变元可以使用)
int free_num;//自由变元的个数

//返回值为-1表示无解,为0是唯一解,否则返回自由变元个数
int Gauss()
{
    int max_r,col,k;
    free_num = 0;
    for(k = 0, col = 0 ; k < equ && col < var ; k++, col++)
    {
        max_r = k;
        for(int i = k+1;i < equ;i++)
        {
            if(abs(a[i][col]) > abs(a[max_r][col]))
                max_r = i;
        }
        if(a[max_r][col] == 0)
        {
            k--;
            free_x[free_num++] = col;//这个是自由变元
            continue;
        }
        if(max_r != k)
        {
            for(int j = col; j < var+1; j++)
                swap(a[k][j],a[max_r][j]);
        }
        for(int i = k+1;i < equ;i++)
        {
            if(a[i][col] != 0)
            {
                for(int j = col;j < var+1;j++)
                    a[i][j] ^= a[k][j];
            }
        }
    }
    for(int i = k;i < equ;i++)
        if(a[i][col] != 0)
            return -1;//无解
    if(k < var) return var-k;//自由变元个数
    //唯一解,回代
    for(int i = var-1; i >= 0;i--)
    {
        x[i] = a[i][var];
        for(int j = i+1;j < var;j++)
            x[i] ^= (a[i][j] && x[j]);
    }
    return 0;
}
void ADD(char *a,char *b,char *c){
    int lena=strlen(a);
    int lenb=strlen(b);
    int lenc=max(lena,lenb),last=0;
    for(int i=0;i<lena||i<lenb;i++){
        if(i<lena) last+=a[i]-'0';
        if(i<lenb) last+=b[i]-'0';
        c[i]='0'+last%10;
        last/=10;
    }
    if(last){
        c[lenc]='0'+last;
        c[lenc+1]='\0';
    }
}
void SUB(char *a){
    int pos=0;
    while(a[pos]=='0') pos++;
    a[pos]--;
    for(int i=0;i<pos;i++)
        a[i]='9';
    int len=strlen(a);
    while(len>1&&a[len-1]=='0')
        len--;
    a[len]='\0';
}
char str1[1000],str2[1000];
int main(){

    int n,m,data;
    make_prime(1000);
    while(~scanf("%d%d",&n,&m)){
        mm(a,0);
        for(int i=0;i<m;i++){
            scanf("%d",&data);
            for(int j=0;j<n;j++){
                int cnt=0;
                while(data%prime[j]==0){
                    cnt++;
                    data/=prime[j];
                }
                cnt%=2;
                a[j][i]=cnt;
            }
        }
        equ=n;
        var=m;
        data=Gauss();
        strcpy(str1,"1");
        for(int i=0;i<data;i++){
            ADD(str1,str1,str2);
            strcpy(str1,str2);
        }
        SUB(str1);
        int len=strlen(str1);
        for(int i=len-1;i>=0;i--)
            printf("%c",str1[i]);
        printf("\n");
    }
    return 0;
}


Windows 10/11下R与RStudio最新版安装避坑指南(含镜像加速配置) 本文提供了Windows 10/11系统下R与RStudio最新版的详细安装指南,包含镜像加速配置和常见问题解决方案。通过分步教程帮助用户避开安装陷阱,优化开发环境设置,特别适合国内用户快速搭建高效的数据分析平台。 阅读详情

相关推荐

DreamerV3实战:如何用世界模型在Minecraft中自动挖钻石(附完整训练流程)

本文详细介绍了如何使用DreamerV3世界模型在Minecraft中训练AI智能体自动完成挖钻石的复杂任务。文章深入分析了该任务对强化学习的挑战,提供了从环境配置、模型训练到结果评估的完整实战流程,并分享了关键的调优技巧与问题解决方案,展示了基于模型的强化学习在解决稀疏奖励问题上的强大能力。

weixin_29050271的博客 189

【笔记】公钥密码学之RSA

数论基础 1.素数: 定义:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。 如:3×4 = 12,不是素数。11除了等于11×1以外,不能表示为其它任何两个整数的乘积,所以11是一个素数。 关于素数的事实: (1)如果p是素数,且p | ab(表示ab能被p整除),则p | a或 p | b ,即p 至少整除a与b中的一个。 (2)算术基本定理:每个整数n ≥ 2 ,均可分解成素数幂之积,即其中而且 是一个质数, 若不计因数的顺序,这个分解式是唯

comptine的博客 1509

R 分析裂区试验设计

裂区试验有主区部分和副区部分, 因而有主区部分误差(误差 a,简记为Ea )和副区部分误差(误差b,简记为Eb) 分别用于测验主区处理以及副区处理和主、副互作的显著性。对同一个二因素试验资料作自由度和平方和的分解,则可发现随机区组的误差项自由度和平方和分别为DFe、SSe,而裂区设计有两个误差项,其自由度和平方和分别为DFEa,DFEb, SSEa, SSEb。而区组,处理效应等各个变异项目的自由

samhuairen的专栏 8933

SGU 200 Cracking RSA (高斯消元)

题目链接:http://acm.sgu.ru/problem.php?contest=0&amp;problem=200 题意:给定m个数,这些数的质因数都是前n个素数。求m有多少个不空子集使得子集中的数字之积为完全平方数。 思路:建立矩阵n*m。a[i][j]表示第j个数中含有第i个素数的个数。解的个数为m-非全零行的个数P的2^P。我的理解是这样,比如两个方程5个未知数: x1+x2+x...

weixin_34060741的博客 175

2021电子科技大学分布式系统期末考点精析与实战解析

本文深入解析2021年电子科技大学分布式系统期末考试核心考点,包括分布式事务、时钟同步、GFS架构等高频内容。基于回忆版试题,提供实战解析与应试技巧,帮助考生高效复习。重点涵盖两阶段提交、Cristian算法等关键技术,适合计算机专业学生备考参考。

weixin_29251131的博客 537

【Unity】Unity性能分析解决方案——UPR

由Unity中国团队提供的一套性能优化解决方案,其是一系列性能工具的集合,并可将收集的数据进行可视化。

Davidorzs的博客 1008

sgu-200 Cracking RSA(简单的高斯消元求自由变元个数)

题目大意: 给你一个t,m,接下来输入m个数a1。。。。am满足ai的质因数包含在前t个质数中 从中取出任意个数,使得乘积为完全平方数,问有多少种取法。 解题思路:

zzj的专栏 1452

24、水下传感器网络中混合LEACH协议与遗传算法获取路由节点

本文提出了一种结合遗传算法与LEACH协议的混合路由方案,用于提升水下无线传感器网络(UWSN)的能量利用效率和数据传输稳定性。通过遗传算法优化簇头选择与路径规划,有效避免节点过早死亡,减少能量消耗,在200个节点场景下显著提升网络寿命。相比传统LEACH协议,该方案具有更高的能量利用率、更强的环境适应性,并支持传输历史记录与并行传输序列。实验结果显示,该方案在总能量为2000焦耳时剩余能量达75.6%,远优于LEACH的34.8%能耗表现。适用于海洋监测、石油平台监控及水下灾害预警等复杂环境应用。

i8j9k0l1的博客 112

SGU 200 Cracking RSA (高斯消元)

转载请注明出处,谢谢http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents    by---cxlove 题意:给出m个整理,因子全部为前t个素数。问有多少个子集,乘积是平方数 http://acm.sgu.ru/problem.php?contest=0&problem=200 做法:列方程组,a1,a2,a3……am分别表示bi

窝不是爱酱,喵~~~~ 3349

3D打印开源硬件MKS Monster8 V2.0 原理图赏析--更新中

MKS MONSTER8 主板是创客基地为满足市场需求而推出的主板,可用于Voron 2.4机器安装,支Marlin 固件和Klipper固件,支持U盘打印(暂时只有Marlin固件支持),支持TMC驱动UART模式,它包含了3D打印机所需要的主要部件和接口,通过MCU集中控制,是一款功能强大的主板。下面详细分析一下。

我的专栏 7222

YOLOv8全网首发:CVPR2026 MixerCSeg | DEGConv方向引导边缘门控,破解细长裂缝检测难题

DEGConv通过方向先验嵌入、边缘增强卷积和动态门控三大机制,针对性解决了YOLO在处理裂缝类细长、多方向、低对比度目标时的特征提取不足问题,显著提升了裂缝检测的精度与鲁棒性。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 514

SGU 200 Cracking RSA (高斯消元+大数高精度)

题目地址:SGU 200 这题居然还考大数高精度。。无语。。 令有该因子偶数个为0,奇数个为1,这样就满足异或运算了,即奇+奇=偶,偶+偶=偶,奇+偶=奇。然后建立方程高斯消元求变元个数free_num,那么子集的个数就是2^free_num-1。减1是去掉0的情况。注意要用大数运算 代码如下: #include #include #include #include #includ

scf0920 1496

SAP 发票凭证反向冲销

发票凭证反向冲销: 业务模拟: MIRO发票校验后,生成发票凭证号: 事务代码MR8M,输入凭证号码,反向冲销(类似于MIGO入库后的反向冲销): 此时进入MIRO查看,发现冲销成功,可以再次做MIRO发票校验: ...

willieyuan的博客 7708

SGU 200 Cracking RSA (高斯消元)

题意: 给出n个数的集合,这n个数的因子都是前t个质数。求这个集合有多少个子集,这个子集满足元素相乘是平方数。 题解: 高斯消元。因为都是质数,那么要得到平方数那么这些集合的元素对应的因子要成对出现,不成对不可能够成完全平方数。于是每个方程代表一个因子,设xi表示集合i元素是否有,然后列出t个式子求解。最后只要求2^(自由因子个数)。 #include #include #include

ACM之梦 550

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SGU 200. Cracking RSA 高斯消元

比较裸的题了。分解因数后消元便行了,答案就是2的自由元数量次方减一(因为空集不算答案) \(2^k-1\) //{HEADS #define FILE_IN_OUT #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include...

weixin_30251587的博客 124

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SGU 200. Cracking RSA(高斯消元+高精度)

标题效果:鉴于m整数,之前存在的所有因素t素数。问:有多少子集。他们的产品是数量的平方。 解题思路: 全然平方数就是要求每一个质因子的指数是偶数次。 对每一个质因子建立一个方程。 变成模2的线性方程组。 求解这个方程组有多少个自由变元。答案就是 2^p- 1 。(-1是去掉空集的情况) 注意因为2^p会超出数据范围所以还须要用高精度算法。 200. Cr...

aofan9566的博客 169

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SGU 200 Cracking RSA(高斯消元+高精度)

Description 给出m个整数,他们都是由前t个素数组成,问有多少个这m个数的子集,使得这个子集中数的乘积是一个完全平方数 Input 第一行两个整数t和m,第二行m个整数bi(1<=t,m<=100,1<=bi<=10^9) Output 输出满足条件的集合个数 Sample Input 3 4 9 20 500 3 Sample Output 3 Solution

ZSQ 709

SGU 200.Cracking RSA(高斯消元)

时间限制:0.25s 空间限制:4M 题意:   给出了m(<100)个数,这m个数的质因子都是前t(<100)个质数构成的。 问有多少个这m个数的子集,使得他们的乘积是完全平方数。 Solution: 要使乘积为完全平方数,那么对于乘积的每个质因子的个数要为偶数。 可以先打出前100个质数,...

weixin_34405332的博客 114

SGU 200. Cracking RSA( 高斯消元 )

把每个数唯一分解, 要让乘积是完全平方数, 那就得让每个质数是偶数次方, 列出t条方程然后解它们在mod 2意义下的自由元个数v(异或方程组). 答案就是2^v-1(空集不算), 高精度...---------------------------------------------------------------------------------------#include<cstri...

weixin_30713953的博客 113

SGU 200. Cracking RSA (高斯消元求自由变元个数)

题目链接:http://acm.sgu.ru/problem.php?contest=0&amp;problem=200 200. Cracking RSA time limit per test: 0.25 sec.memory limit per test: 65536 KB input: standardoutput: standard The following p...

weixin_34406061的博客 155

sgu200:Cracking RSA(模意义下高斯消元求自由变元个数)

题意: 有b个数,每个数经质因数分解后质因子都是是质数表中前t个质数中的一个。 给出序列b,正整数t,我们从b中选若干个数乘起来得到一个积,问有多少种取法使得积为完全平方数。 分析: 要使积为完全平方数,那么分解后每个质数出现次数为偶数次。 我们可以以每一个质数作为一个方程,g[i][j]表示第i个质数在bj中出现的次数,解这个模2线性方程组即可。 设自由元个数为k

qq_20118433的专栏 726

sgu200--Cracking RSA(高斯消元问题6,求乘积为完全平方数的种数)

Cracking RSA Time Limit:250MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status   Description <script type="text/javascript" language="javascript" src="http:/

随风的专栏 1218

[SGU200 Cracking RSA]

[关键字]:数学 高斯消元 异或方程组 [题目大意]:给出m个数,保证每个数的质因数都不超过第t大的质数。从中选出若干数使其乘积为完全平方数,问有多少选择方法。 //================================================================================= [分析]:首先可以想到如果一个数是完全平方数那它的所有质因数的指...

weixin_30326745的博客 102
上一篇: hdu4579 Random Walk
下一篇: CodeForces - 111D Petya and Coloring
我不会额
博客等级 码龄11年 2粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值