首页 > 其他分享 >SGU 200 Cracking RSA (高斯消元+大数高精度)

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

时间:2023-04-13 23:41:16浏览次数:38  
标签:tmp 200 const int max SGU 120 include 高斯消


题目地址:SGU 200

这题居然还考大数高精度。。无语。。

令有该因子偶数个为0,奇数个为1,这样就满足异或运算了,即奇+奇=偶,偶+偶=偶,奇+偶=奇。然后建立方程高斯消元求变元个数free_num,那么子集的个数就是2^free_num-1。减1是去掉0的情况。注意要用大数运算

代码如下:


#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
#define pi acos(-1.0)
const int mod=1e9+7;
const int INF=1e9;
const double eqs=1e-9;
int mat[120][120], a[120], equ, var, prime[120];
int c[100];
int gauss()
{
        int i, j, k, h, max_r, tmp;
        for(i=0,j=0;i<equ&&j<var;i++,j++){
                max_r=i;
                for(k=i+1;k<equ;k++){
                        if(mat[k][j]>mat[max_r][j]) max_r=k;
                }
                if(max_r!=i){
                        for(k=j;k<=var;k++){
                                swap(mat[i][k],mat[max_r][k]);
                        }
                }
                if(mat[i][j]==0){
                        i--;
                        continue ;
                }
                for(k=i+1;k<equ;k++){
                        if(mat[k][j]==0) continue ;
                        for(h=j;h<=var;h++){
                                mat[k][h]^=mat[i][h];
                        }
                }
        }
        tmp=i;
        //printf("%d\n",tmp);
        for(;i<equ;i++){
                if(mat[i][var]){
                        return 0;
                }
        }
        return var-tmp;
}
void output(int k)
{
        int i, j, x, y, tmp;
        memset(c,0,sizeof(c));
        c[0]=1;
        x=0;
        for(i=0;i<k;i++){
                for(j=0;j<=80;j++){
                        y=(c[j]*2+x)%10;
                        x=(c[j]*2+x)/10;
                        c[j]=y;
                }
        }
        for(i=80;i>=0;i--){
                if(c[i]){
                        tmp=i;
                        break;
                }
        }
        c[0]--;
        for(i=tmp;i>=0;i--){
                printf("%d",c[i]);
        }
        puts("");
}
void init()
{
        int i, j, cnt=0, flag;
        for(i=2;;i++){
                flag=0;
                for(j=2;j*j<=i;j++){
                        if(i%j==0){
                                flag=1;
                                break;
                        }
                }
                if(!flag){
                        prime[cnt++]=i;
                }
                if(cnt==100) return ;
        }
}
int main()
{
        int t, n, i, j, x, cnt, ans;
        init();
        scanf("%d%d",&t,&n);
        for(i=0; i<n; i++) {
                scanf("%d",&a[i]);
        }
        for(i=0; i<n; i++) {
                x=a[i];
                for(j=0;j<t;j++){
                        cnt=0;
                        while(x%prime[j]==0){
                                cnt++;
                                x/=prime[j];
                        }
                        mat[j][i]=(cnt&1);
                }
        }
        for(i=0;i<t;i++){
                mat[i][n]=0;
        }
        equ=t;
        var=n;
        ans=gauss();
        if(ans)
        output(ans);
        else puts("0");
        return 0;
}



标签:tmp,200,const,int,max,SGU,120,include,高斯消
From: https://blog.51cto.com/u_16070138/6188688

相关文章

  • POJ 1753 Flip Game (高斯消元)
    题目地址:POJ1753第三次做这道题了。第一次是刚学搜索的时候做的,第二次是刚学状态压缩枚举的时候做的,这次是刚学高斯消元、、每次都做得很艰辛。。目测这题应该没了别的方法了吧。。。。。。这题除了高斯消元外还需要枚举变元,方法是状态压缩枚举,然后返回去迭代解方程。代码如下:#inc......
  • POJ 1830 开关问题 (高斯消元)
    题目地址:POJ1830高斯消元第一发。一个地方逻辑判断出现了失误,调了一下午啊。。。通过高斯消元来找矩阵的秩,然后2^(自由元的数量)就是答案。因为对于每个自由元,都有0和1两种状态可选。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#includ......
  • 梦回2008<金曲名单>
    爱转角,雨爱,只对你有感觉,爱你,一直很安静,一直很安静,三国恋,大城小爱,蓝莲花,一生有你,星月神话,千年之恋,有何不可,爱的就是你突然的自我,会呼吸的痛,可惜不是你,宁夏,倔强,波斯猫,死了都要爱,没那么简单,秋天不回来,该死的温柔,老人与海,等一分钟,求佛,你不是真正的快乐,天路,寂寞沙洲冷,怒放的生命,快乐崇......
  • HDU 1452 Happy 2004 (积性函数)
    题目地址:HDU1452性质1:如果gcd(a,b)=1则S(a*b)=S(a)*S(b)2004^X=4^X*3^X*167^XS(2004^X)=S(2^(2X))*S(3^X)*S(167^X)性质2:如果p是素数则S(p^X)=1+p+p^2+…+p^X=(p^(X+1)-1)/(p-1)因此:S(2004^X)=(2^(2X+1)-1)*(3^(X+1)-1)/2*(167^(X+1)-1)/166......
  • BZOJ 1036 [ZJOI2008] 树的统计Count (树链剖分)
    题目地址:BZOJ1036树链剖分裸题,需要用线段树同时维护最大值与和值两个信息,只是代码量大一点而已。。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#include<stdlib.h>#include<map>#include<set&g......
  • POJ 2001 Shortest Prefixes(字典树)
    题目地址:POJ2001考察的字典树,利用的是建树时将每一个点只要走过就累加。最后从根节点开始遍历,当遍历到只有1次走过的时候,就说明这个地方是最短的独立前缀。然后记录下长度,输出即可。代码如下:#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#inc......
  • S7-1200 Modbus RTU 通信概述
    S7-1200ModbusRTU通信概述Modbus具有两种串行传输模式:分别为ASCII和RTU。Modbus是一种单主站的主从通信模式,Modbus网络上只能有一个主站存在,主站在Modbus网络上没有地址,每个从站必须有唯一的地址,从站的地址范围为0-247,其中0为广播地址,从站的实际地址范围为1-247。Modbus......
  • 2004-text3
    2004-text3economy经济,节约economic经济的,合算的,有经济效益的client委托人,顾客indicator指示者,指示器,指标indicate标示,指出,表明;象征,暗示concerned担心的,烦恼的,忧虑的admission承认,准许进入admit承认,许可进入slowdown减速,减缓slowdo......
  • Shanghai 2006 / UVa 1382 Distant Galaxy (枚举&扫描&动态维护)
    1382-DistantGalaxyTimelimit:3.000seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=460&page=show_problem&problem=4128YouareobservingadistantgalaxyusingatelescopeabovetheAstronomyTower,......
  • SPEC2006的学习与总结
    SPEC2006的学习与总结摘要最近特别想进行一些性能验证工作.所以研究了spec2006然后想整理一下之前的内容.想着将内容整理一下.这次主要是抄别人的.知识来源:https://blog.csdn.net/wkl_venus/article/details/127688671获取测试结果的命令nohuprunspec--repor......