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

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

    ---------------------------------------------------------------------------------------

    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<bitset>
     
    using namespace std;
     
    const int maxn = 109;
     
    int ans[maxn], n;
    int p[maxn], pn = 0;
    int N, M;
    bitset<maxn> mat[maxn], F;
     
    void Init() {
    F.reset();
    for(int i = 2; i <= 600; i++) {
    if(!F[i]) p[pn++] = i;
    for(int j = 0; j < pn && i * p[j] < 600; j++) {
    F[i * p[j]] = 1;
    if(i % p[j] == 0) break;
    }
    }
    scanf("%d%d", &N, &M);
    for(int i = 0; i < N; i++) mat[i].reset();
    for(int i = 0; i < M; i++) {
    int v; scanf("%d", &v);
    for(int j = 0; j < N && v != 1; j++)
    for(; v % p[j] == 0; v /= p[j]) mat[j][i] = mat[j][i] ^ 1;
    }
    }
     
    void Write(int v) {
    n = 0;
    memset(ans, 0, sizeof ans);
    ans[n++] = 1;
    while(v--) {
    for(int i = 0; i < n; i++) ans[i] <<= 1;
    for(int i = 0; i < n; i++) 
    if(ans[i] >= 10) ans[i] -= 10, ans[i + 1]++;
    if(ans[n]) n++;
    }
    ans[0]--;
    for(int i = 0; i < n; i++)
    if(ans[i] < 0) ans[i] += 10, ans[i + 1]--;
    if(!ans[n - 1]) n--;
    if(!n)
    putchar('0');
    else {
    while(n--)
    putchar(ans[n] + '0');
    }
    puts("");
    }
     
    void Solve() {
    int v = 0;
    for(int i = 0; i < M; i++) {
    for(int j = v; j < N; j++) if(mat[j][i]) {
    if(j != v) swap(mat[j], mat[v]);
    for(int k = v; ++k < N; )
    if(mat[k][i]) mat[k] ^= mat[v];
    v++;
    break;
    }
    if(v >= N) break;
    }
    Write(M - v);
    }
     
    int main() {
    Init();
    Solve();
    return 0;
    }

    ---------------------------------------------------------------------------------------

    200. Cracking RSA

    time limit per test: 0.25 sec.
    memory limit per test: 65536 KB
    input: standard
    output: standard



    The following problem is somehow related to the final stage of many famous integer factorization algorithms involved in some cryptoanalytical problems, for example cracking well-known RSA public key system. 

    The most powerful of such algorithms, so called quadratic sieve descendant algorithms, utilize the fact that if n = pq where p and q are large unknown primes needed to be found out, then if v2=w2(mod n), u ≠ v (mod n) and u ≠ -v (mod n), then gcd(v + w, n) is a factor of n (either p or q). 

    Not getting further in the details of these algorithms, let us consider our problem. Given m integer numbers b1, b2, ..., bm such that all their prime factors are from the set of first t primes, the task is to find such a subset S of {1, 2, ..., m} that product of bi for i from S is a perfect square i.e. equal to u2 for some integer u. Given such S we get one pair for testing (product of S elements stands for v when w is known from other steps of algorithms which are of no interest to us, testing performed is checking whether pair is nontrivial, i.e. u ≠ v (mod n) and u ≠ -v (mod n)). Since we want to factor n with maximum possible probability, we would like to get as many such sets as possible. So the interesting problem could be to calculate the number of all such sets. This is exactly your task. 

    Input

    The first line of the input file contains two integers t and m (1 ≤ t ≤ 100, 1 ≤ m ≤ 100). The second line of the input file contains m integer numbers bi such that all their prime factors are from t first primes (for example, if t = 3 all their prime factors are from the set {2, 3, 5}). 1 ≤ bi ≤ 109 for all i. 

    Output

    Output the number of non-empty subsets of the given set {bi}, the product of numbers from which is a perfect square 

    Sample test(s)

    Input

    3 4 
    9 20 500 3 

    Output


    Author:Andrew Stankevich
    Resource:Petrozavodsk Winter Trainings 2003
    Date:2003-02-06







  • 相关阅读:
    二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离
    Java:JUnit4使用详解
    Java 常用数据结构对象的实现原理 集合类 List Set Map 哪些线程安全 (美团面试题目)
    JAVA里的布尔运算符-甲骨文面试题
    try catch finally 用法
    Java的JDBC事务详解
    Java开发中JDBC连接数据库代码和步骤
    WebUploader文件图片上传插件的使用
    webuploader解决不能重复上传问题及一些常见问题处理
    HTML5 input file控件使用accept过滤限制的文件类型以及在谷歌下打开很慢的问题
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/5044977.html
Copyright © 2011-2022 走看看