zoukankan      html  css  js  c++  java
  • SGU 200. Cracking RSA 高斯消元

    比较裸的题了。分解因数后消元便行了,答案就是2的自由元数量次方减一(因为空集不算答案) (2^k-1)

    //{HEADS
    #define FILE_IN_OUT
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <ctime>
    #include <algorithm>
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <deque>
    #include <map>
    #include <set>
    #include <bitset>
    #include <complex>
    #include <string>
    #define REP(i, j) for (int i = 1; i <= j; ++i)
    #define REPI(i, j, k) for (int i = j; i <= k; ++i)
    #define REPD(i, j) for (int i = j; 0 < i; --i)
    #define STLR(i, con) for (int i = 0, sz = con.size(); i < sz; ++i)
    #define STLRD(i, con) for (int i = con.size() - 1; 0 <= i; --i)
    #define CLR(s) memset(s, 0, sizeof s)
    #define SET(s, v) memset(s, v, sizeof s)
    #define mp make_pair
    #define pb push_back
    #define PL(k, n) for (int i = 1; i <= n; ++i) { cout << k[i] << ' '; } cout << endl
    #define PS(k) STLR(i, k) { cout << k[i] << ' '; } cout << endl
    using namespace std;
    void FILE_INIT(string FILE_NAME) {
    #ifdef FILE_IN_OUT
    #ifndef ONLINE_JUDGE 
        freopen((FILE_NAME + ".in").c_str(), "r", stdin);
        freopen((FILE_NAME + ".out").c_str(), "w", stdout);
    #endif
    #endif
    }
    typedef long long LL;
    typedef double DB;
    typedef pair<int, int> i_pair;
    const int INF = 0x3f3f3f3f;
    //}
    
    const int maxn = 1000 + 5;
    
    bool is_prime[maxn];
    int p[maxn], cnt;
    
    void sieve() {
        memset(is_prime, true, sizeof is_prime);
        for(int i = 2; i < maxn; ++i) {
            if(is_prime[i]) {
                p[cnt++] = i;
                for(int j = i; j < maxn; j += i) {
                    is_prime[j] = false;
                }
            }
        }
    }
    
    bitset<105> fac[105];
    int t, m;
    int d[maxn];
    
    int guass() {
        int k = 0;
        for(int i = 0; k < m && i < t; ++i) {
            for(int j = k; j < m; ++j) {
                if(fac[j].test(i)) {
                    if(j != k) {
                        swap(fac[j], fac[k]);
                    }
                    break;
                }
            }
            if(!fac[k].test(i)) {
                continue;
            }
            for(int j = i + 1; j < m; ++j) {
                if(fac[j].test(i)) {
                    fac[j] ^= fac[i];
                }
            }
            ++k;
        }
        return m - k;
    }
    
    void divide(int num, int pos) {
        for(int i = 0; i < t; ++i) {
            while(num % p[i] == 0) {
                num /= p[i];
                fac[pos].flip(i);
            }
        }
    }
    
    int ans[100];
    void answer(int index) {
        ans[0] = ans[1] = 1;
        for(int i = 1; i <= index; ++i) {
            for(int j = 1; j <= ans[0]; ++j) {
                ans[j] *= 2;
            }
            for(int j = 1; j <= ans[0]; ++j) {
                if(ans[j] > 9) {
                    ans[j + 1] += ans[j] / 10;
                    ans[j] %= 10;
                }
            }
            while(ans[ans[0] + 1] > 0) {
                ++ans[0];
            }
        }
        ans[1] -= 1;
        for(int i = 1; i <= ans[0]; ++i) {
            if(ans[i] < 0) {
                ans[i] += 10;
                ans[i + 1] -= 1;
            }
        }
        for(int i = ans[0]; 0 < i; --i) {
            printf("%d", ans[i]);
        }
        if(ans[0] == 0) {
            printf("0");
        }
        puts("");
    }
    
    int main() {
        FILE_INIT("200");
    
        sieve();
        scanf("%d%d", &t, &m);
        for(int i = 0; i < m; ++i) {
            scanf("%d", &d[i]);
            divide(d[i], i);
        }
        int num = guass();
        //printf("%d
    ", num);
        answer(num);
    
        return 0;
    }
  • 相关阅读:
    Windows下MySQL多实例运行
    Java中,什么时候用logger.debuge,info,error
    乒乓球(Table Tennis)
    [Delphi]Delphi学习
    [CALL]01
    [转自看雪]新手学习计划
    [JAVA]函数
    [1.1]
    [SQL]课堂记录
    [SYS]VS2010驱动开发配置
  • 原文地址:https://www.cnblogs.com/hzf-sbit/p/200_Cracking_RSA.html
Copyright © 2011-2022 走看看