标签:des style http color os strong io 数据
题目大意:给出m个整数,因子全部存在于前t个素数。问有多少个子集,他们的乘积是平方数。
解题思路:
完全平方数就是要求每个质因子的指数是偶数次。
对每个质因子建立一个方程。 变成模2的线性方程组。
求解这个方程组有多少个自由变元,答案就是 2^p - 1 。(-1是去掉空集的情况)
注意由于2^p会超出数据范围所以还需要用高精度算法。
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-10
///#define M 1000100
#define LL __int64
///#define LL long long
///#define INF 0x7ffffff
#define INF 0x3f3f3f3f
#define PI 3.1415926535898
#define zero(x) ((fabs(x)<eps)?0:x)
const int maxn = 210;
using namespace std;
bool f[maxn+1000];
int k[maxn+1000];
int a[maxn][maxn];
int num[maxn];
int equ, var;
char str1[maxn], str2[maxn];
void Add(char a[], char b[], char c[])
{
    int len1 = strlen(a);
    int len2 = strlen(b);
    int n = max(len1, len2);
    int add = 0;
    for(int i = 0; i < n; i++)
    {
        int cnt = 0;
        if(i < len1) cnt += a[i]-'0';
        if(i < len2) cnt += b[i]-'0';
        cnt += add;
        add = cnt/10;
        c[i] = cnt%10+'0';
    }
    if(add) c[n++] = add+'0';
    c[n] = 0;
}
void Sub_1(char a[])
{
    int s = 0;
    while(a[s] == '0') s++;
    a[s]--;
    for(int i = 0; i < s; i++)
        a[i] = '9';
    int len = strlen(a);
    while(len > 1 && a[len-1] == '0') len--;
    a[len] = 0;
}
void Prime()
{
    int t = 0;
    memset(f, false, sizeof(f));
    for(int i = 2; i <= 1005; i++)
    {
        if(!f[i])
            k[t++] = i;
        for(int j = 0; j < t; j++)
        {
            if(i*k[j] > 1005)
                break;
            f[i*k[j]] = true;
            if(i%k[j] == 0)
                break;
        }
    }
}
int Gauss()
{
    int row, col;
    int max_r;
    row = col = 0;
    while(row < equ && col < var)
    {
        max_r = row;
        for(int i = row+1; i < equ; i++)
        {
            if(a[i][col]) max_r = i;
        }
        if(a[max_r][col] == 0)
        {
            col++;
            continue;
        }
        if(max_r != row)
        {
            for(int j = col; j <= var; j++) swap(a[max_r][j], a[row][j]);
        }
        for(int i = row+1; i < equ; i++)
        {
            if(a[i][col] == 0) continue;
            for(int j = col; j <= var; j++) a[i][j] ^= a[row][j];
        }
        col++;
        row++;
    }
    return var-row;
}
int main()
{
    Prime();
    int n, m;
    while(cin >>n>>m)
    {
        memset(a, 0, sizeof(a));
        for(int i = 0; i < m; i++) cin >>num[i];
        equ = n;
        var = m;
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < m; j++)
            {
                int ans = 0;
                while(num[j]%k[i] == 0)
                {
                    ans ++;
                    num[j]/=k[i];
                }
                if(ans%2) a[i][j] = 1;
            }
        }
        int N = Gauss();
        strcpy(str1, "1");
        for(int i = 0; i < N; i++)
        {
            Add(str1, str1, str2);
            strcpy(str1, str2);
        }
        Sub_1(str1);
        for(int i = strlen(str1)-1; i >= 0; i--) cout<<str1[i];
        cout<<endl;
    }
    return 0;
}SGU 200. Cracking RSA(高斯消元+高精度),布布扣,bubuko.com
SGU 200. Cracking RSA(高斯消元+高精度)
标签:des style http color os strong io 数据
原文地址:http://blog.csdn.net/xu12110501127/article/details/38304627