标签: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