记录编号 86113 评测结果 AAAAAAAAAA
题目名称 [UVa 11542] 乘积是平方数 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.112 s
提交时间 2014-01-20 21:06:01 内存使用 2.30 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<vector>
  7. #include<queue>
  8. #include<iomanip>
  9. #include<queue>
  10. #include<set>
  11. #include<map>
  12. using namespace std;
  13. typedef long long ll;
  14. const int SIZEP=510,SIZEN=510;
  15. vector<int> prime;
  16. void getprime(int n){
  17. bool flag[SIZEP]={0};
  18. for(int i=2;i<=n;i++){
  19. if(!flag[i]){
  20. prime.push_back(i);
  21. for(int j=i*i;j<=n;j+=i) flag[j]=true;
  22. }
  23. }
  24. }
  25. int xor_rank(ll A[SIZEN][SIZEN],int b[SIZEN],int n,int m){
  26. //使用高斯约当消元法,求异或方程组的秩
  27. //A是异或方程组,b是方程右边的常数向量,n是行数,m是列数
  28. int i,j,k;
  29. for(i=1;i<=n;i++){//第i次消元
  30. for(k=i;k<=m;k++){//选取消元列
  31. for(j=i;j<=n;j++){//选取消元行
  32. if(A[j][k]) goto BREAK;
  33. }
  34. }
  35. BREAK:;
  36. if(j==n+1) break;//找不到可消元的元素了
  37. if(i!=j){//交换行
  38. for(int km=1;km<=m;km++) swap(A[i][km],A[j][km]);
  39. swap(b[i],b[j]);
  40. }
  41. if(i!=k) for(int km=1;km<=n;km++) swap(A[km][i],A[km][k]);//交换列
  42. for(j=1;j<=n;j++){//消元
  43. if(j==i) continue;
  44. if(A[j][i]){
  45. for(int km=1;km<=m;km++) A[j][km]^=A[i][km];
  46. b[j]^=b[i];
  47. }
  48. }
  49. }
  50. return i-1;
  51. }
  52. int N,M;
  53. ll A[SIZEN][SIZEN]={0};
  54. int b[SIZEN]={0};
  55. void work(void){
  56. scanf("%d",&N);
  57. memset(A,0,sizeof(A));
  58. memset(b,0,sizeof(b));
  59. int i,j;
  60. ll x;
  61. for(i=1;i<=N;i++){
  62. scanf("%lld",&x);
  63. j=0;
  64. while(x>1&&j<M){
  65. while(x%prime[j]==0){
  66. A[j+1][i]^=1;
  67. x/=prime[j];
  68. }
  69. j++;
  70. }
  71. }
  72. ll ans=xor_rank(A,b,M,N);
  73. ans=N-ans;
  74. cout<<(1LL <<ans)-1<<endl;//这里的LL很重要
  75. }
  76. int main(){
  77. freopen("square1.in","r",stdin);
  78. freopen("square1.out","w",stdout);
  79. getprime(500);
  80. M=prime.size();
  81. int T;
  82. scanf("%d",&T);
  83. while(T--) work();
  84. return 0;
  85. }
  86.