SGU 200. Cracking RSA(高斯消元+高精度)
标题效果:鉴于m整数,之前存在的所有因素t素数。问:有多少子集。他们的产品是数量的平方。
解题思路:
全然平方数就是要求每一个质因子的指数是偶数次。
对每一个质因子建立一个方程。
变成模2的线性方程组。
求解这个方程组有多少个自由变元。答案就是 2^p - 1 。(-1是去掉空集的情况)
注意因为2^p会超出数据范围所以还须要用高精度算法。
200. Cracking RSA
memory limit per test: 65536 KB
output: standard
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
#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(高斯消元+高精度)的更多相关文章
- SGU 200.Cracking RSA(高斯消元)
时间限制:0.25s 空间限制:4M 题意: 给出了m(<100)个数,这m个数的质因子都是前t(<100)个质数构成的. 问有多少个这m个数的子集,使得他们的乘积是完全平方数. Solu ...
- Acdream1217 Cracking' RSA(高斯消元)
题意:给你m个数(m<=100),每个数的素因子仅来自于前t(t<=100)个素数,问这m个数的非空子集里,满足子集里的数的积为完全平方数的有多少个. 一开始就想进去里典型的dp世界观里, ...
- SGU 200 Cracking RSA (高斯消元)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意:给出m个整理,因子全部为前t个素数.问有多少 ...
- SGU 200. Cracking RSA (高斯消元求自由变元个数)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=200 200. Cracking RSA time limit per test: ...
- HDU2449 Gauss Elimination 高斯消元 高精度 (C++ AC代码)
原文链接https://www.cnblogs.com/zhouzhendong/p/HDU2449.html 题目传送门 - HDU2449 题意 高精度高斯消元. 输入 $n$ 个 $n$ 元方程 ...
- SGU 260.Puzzle (异或高斯消元)
题意: 有n(<200)个格子,只有黑白两种颜色.可以通过操作一个格子改变它和其它一些格子的颜色.给出改变的关系和n个格子的初始颜色,输出一种操作方案使所有格子的颜色相同. Solution: ...
- ACM学习历程—SGU 275 To xor or not to xor(xor高斯消元)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=275 这是一道xor高斯消元. 题目大意是给了n个数,然后任取几个数,让他们xor和 ...
- SGU 275 To xor or not to xor 高斯消元求N个数中选择任意数XORmax
275. To xor or not to xor The sequence of non-negative integers A1, A2, ..., AN is given. You are ...
- SGU 275 To xor or not to xor (高斯消元)
题目链接 题意:有n个数,范围是[0, 10^18],n最大为100,找出若干个数使它们异或的值最大并输出这个最大值. 分析: 一道高斯消元的好题/ 我们把每个数用二进制表示,要使得最后的异或值最大, ...
随机推荐
- linuxserver启动过程
随着Linux的应用日益广泛.特别是在网络应用方面,有大量的网络server使用Linux操作系统.因为Linux的桌面应用和Windows相比另一 定的差距.所以在企业应用中往往是Linux和Win ...
- css中padding中样式的顺序含义
4种可能的情况.举例说明: padding:10px; 四个内边距都是10px padding:5px 10px; 上下5px 左右10px padding:5px 10px 15px; 上5px 右 ...
- Nagios+pnp4nagios+rrdtool 安装配置nagios(一)
基于的软件版本 Apache-2.0.63 php-5.3.2 nagios-3.2.3 nagios-plugins-1.4.15 rrdtool-1.4.5 nrpe-2.12 pnp4na ...
- 扔鸡蛋问题具体解释(Egg Dropping Puzzle)
经典的动态规划问题,题设是这种: 假设你有2颗鸡蛋,和一栋36层高的楼,如今你想知道在哪一层楼之下,鸡蛋不会被摔碎,应该怎样用最少的測试次数对于不论什么答案楼层都可以使问题得到解决. 假设你从某一层楼 ...
- 重新想象 Windows 8 Store Apps (5) - 控件之集合控件: ComboBox, ListBox, FlipView, ItemsControl, ItemsPresenter
原文:重新想象 Windows 8 Store Apps (5) - 控件之集合控件: ComboBox, ListBox, FlipView, ItemsControl, ItemsPresente ...
- lua5.1 和 5.2 关于 sequence 的定义变化,对#table取值的影响
引子 环境 lua 5.2 a = {} for i=1,2 do a[i] = i*3 end a[4] = 11; print(a[#a]) ---print 11 ------- ...
- Cocos2d-x学习笔记(五岁以下儿童) 精灵两种方式播放动画
这几天在看控件类,临时没有想好实际运用的方向.单纯的创建网上已经有非常多这方面的样例,我就不写了.接下来是学习精灵类.精灵类若是单独学习也是非常easy.于是我加了一些有关动画方面的知识点与精灵 ...
- 请注意CSDN社区微通道,许多其他的精彩等着你
CSDN社区微信公众号"程序人生"(微信ID:coder_life)来了,每天我们会将CSDN社区中大量的优质内容浓缩成1~3篇文章.推送到您的手机中,让您不管何时何地都能感受到知 ...
- Android使用的开发MediaRecorder录制声音
至 Android 录制声音的应用,Android提供 MediaRecorder 类别.大约MediaRecorder可以参考一个特定的解释<Android开发之MediaRecorder类具 ...
- 使用order by和rownum时特别注意
起因 在项目中有用到某表作为数据来源,在页面以列表的形式显示.使用的数据库是Oracle,分页的时候使用到了rownum这个关键字.列表有排序功能,自然也用到了order by.接下来问题出现了,我在 ...