传送门:hdu 5833 Zhu and 772002

题意:给n个数,每个数的素数因子不大于2000,让你从其中选则大于等于1个数相乘之后的结果为完全平方数

思路:

  1. 小于等于2000的素数一共也只有305个
  2. 一个数,如果他某个素数因子的幂为偶,那这个素数的可以不用考虑;如果幂为奇数,那这个素数就应当被考虑如何与其他数凑成幂为偶数。例如12,可以表示为2^2*3,2的幂次为2,3的幂次为1,所以,如果要和其他数相乘为完全平方数,那么一定要与素数因子3为奇次的合并
  3. 那么根据上面两条,我们可以列出方程:x1*a11+x2*a12+...+xn*a1n=0;x为解,如果aii取为1,不取为0;aii表示ai的第i个素数因子是否为奇,是为1,否则为0,(素数按从小到大排序,依次为2,3,5,7...)
  4. 答案即为2^(x中自由元的个数)-1
  1. /**************************************************************
  2. Problem:hdu 5833 Zhu and 772002
  3. User: youmi
  4. Language: C++
  5. Result: Accepted
  6. Time:
  7. Memory:
  8. ****************************************************************/
  9. //#pragma comment(linker, "/STACK:1024000000,1024000000")
  10. //#include<bits/stdc++.h>
  11. #include <iostream>
  12. #include <cstdio>
  13. #include <cstring>
  14. #include <algorithm>
  15. #include <map>
  16. #include <stack>
  17. #include <set>
  18. #include <sstream>
  19. #include <cmath>
  20. #include <queue>
  21. #include <deque>
  22. #include <string>
  23. #include <vector>
  24. #define zeros(a) memset(a,0,sizeof(a))
  25. #define ones(a) memset(a,-1,sizeof(a))
  26. #define sc(a) scanf("%d",&a)
  27. #define sc2(a,b) scanf("%d%d",&a,&b)
  28. #define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
  29. #define scs(a) scanf("%s",a)
  30. #define sclld(a) scanf("%I64d",&a)
  31. #define pt(a) printf("%d\n",a)
  32. #define ptlld(a) printf("%I64d\n",a)
  33. #define rep(i,from,to) for(int i=from;i<=to;i++)
  34. #define irep(i,to,from) for(int i=to;i>=from;i--)
  35. #define Max(a,b) ((a)>(b)?(a):(b))
  36. #define Min(a,b) ((a)<(b)?(a):(b))
  37. #define lson (step<<1)
  38. #define rson (lson+1)
  39. #define eps 1e-6
  40. #define oo 0x3fffffff
  41. #define TEST cout<<"*************************"<<endl
  42. const double pi=*atan(1.0);
  43.  
  44. using namespace std;
  45. typedef long long ll;
  46. template <class T> inline void read(T &n)
  47. {
  48. char c; int flag = ;
  49. for (c = getchar(); !(c >= '' && c <= '' || c == '-'); c = getchar()); if (c == '-') flag = -, n = ; else n = c - '';
  50. for (c = getchar(); c >= '' && c <= ''; c = getchar()) n = n * + c - ''; n *= flag;
  51. }
  52. ll Pow(ll base, ll n, ll mo)
  53. {
  54. if (n == ) return ;
  55. if (n == ) return base % mo;
  56. ll tmp = Pow(base, n >> , mo);
  57. tmp = (ll)tmp * tmp % mo;
  58. if (n & ) tmp = (ll)tmp * base % mo;
  59. return tmp;
  60. }
  61. //***************************
  62.  
  63. int n;
  64. const ll mod=;
  65. const int maxn=;
  66. ll prime[maxn];
  67. bool isprime[maxn*];
  68. int tot;
  69. int a[][];
  70. int x[];
  71. int fre[];
  72. int index;
  73. int tt=;
  74. void prim()//素数筛法
  75. {
  76. tot=;
  77. memset(isprime,true,sizeof(isprime));
  78. prime[tot++]=;
  79. for(int i=;i<maxn;i+=)
  80. {
  81. if(isprime[i])
  82. {
  83. prime[tot++]=i;
  84. for(ll j=i;1ll*i*j<1ll*maxn;j+=)
  85. isprime[i*j]=false;
  86. }
  87. }
  88. }
  89. void solve(int i,ll x)//判断x有哪些素数因子的幂为奇
  90. {
  91. int cnt=;
  92. rep(j,,tot)
  93. {
  94. cnt=;
  95. if(x%prime[j]==)
  96. {
  97. while(x%prime[j]==)
  98. {
  99. cnt++;
  100. x/=prime[j];
  101. }
  102. }
  103. if(cnt%)
  104. a[i][j]=;
  105. if(x==)
  106. break;
  107. }
  108. }
  109. void debug(int rw,int cl)
  110. {
  111. rep(i,,rw-)
  112. {
  113. rep(j,,cl-)
  114. printf("%d ",a[i][j]);
  115. printf("\n");
  116. }
  117. }
  118. int gauss(int rw,int cl)//高斯消元法,01异或
  119. {
  120. int i,j,k;
  121. int mx=;
  122. for(i=,j=;i<rw&&j<cl-;i++,j++)
  123. {
  124. mx=i;
  125. for(k=i;k<rw;k++)
  126. {
  127. if(abs(a[k][j])>abs(a[mx][j]))
  128. mx=k;
  129. }
  130. if(mx!=i)
  131. {
  132. for(k=j;k<cl;k++)
  133. swap(a[mx][k],a[i][k]);
  134. }
  135. if(a[i][j]==)
  136. {
  137. i--;
  138. continue;
  139. }
  140. for(k=i+;k<rw;k++)
  141. {
  142. if(a[k][j]!=)
  143. {
  144. for(int t=j;t<cl;t++)
  145. {
  146. a[k][t]^=a[i][t];
  147. }
  148. }
  149. }
  150. }
  151. if(i<rw)
  152. {
  153. for(k=i-;k>=;k--)
  154. {
  155. int num=;
  156. for(int t=;t<cl;t++)
  157. {
  158. if(a[k][t]!=&&fre[t])
  159. num++,index=t;
  160. }
  161. if(num>)
  162. continue;
  163. int temp=a[k][cl-];
  164. for(int t=;t<cl-;t++)
  165. if(a[k][t]!=&&index!=t)
  166. temp^=a[k][t]&&x[t];
  167. x[k]=temp&&a[k][k];
  168. fre[index]=;
  169. }
  170. return rw-i;
  171. }
  172. return ;
  173. }
  174. int main()
  175. {
  176. #ifndef ONLINE_JUDGE
  177. freopen("in.txt","r",stdin);
  178. #endif
  179. prim();
  180. int T;
  181. scanf("%d", &T);
  182. for (int kase = ;kase <= T;kase++)
  183. {
  184. int n;
  185. scanf("%d", &n);
  186. zeros(a);
  187. zeros(x);
  188. memset(fre,,sizeof(fre));
  189. for (int i=;i<n;i++)
  190. {
  191. long long x;
  192. scanf("%I64d", &x);
  193. solve(i,x);
  194. }
  195. ll ans=gauss(n,tt);
  196. ans=(Pow(,ans,mod)-+mod)%mod;
  197. printf("Case #%d:\n%I64d\n", kase,ans);
  198. }
  199. return ;
  200. }

hdu 5833 Zhu and 772002 ccpc网络赛 高斯消元法的更多相关文章

  1. HDU 5833 Zhu and 772002

    HDU 5833 Zhu and 772002 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  2. HDU 5833 Zhu and 772002 (高斯消元)

    Zhu and 772002 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5833 Description Zhu and 772002 are b ...

  3. hdu 5833 Zhu and 772002 高斯消元

    Zhu and 772002 Problem Description Zhu and 772002 are both good at math. One day, Zhu wants to test ...

  4. hdu 5833 Zhu and 772002 异或方程组高斯消元

    ccpc网赛卡住的一道题 蓝书上的原题 但是当时没看过蓝书 今天又找出来看看 其实也不是特别懂 但比以前是了解了一点了 主要还是要想到构造异或方程组 异或方程组的消元只需要xor就好搞了 数学真的是硬 ...

  5. hdu 6152 : Friend-Graph (2017 CCPC网络赛 1003)

    题目链接 裸的结论题.百度 Ramsey定理.刚学过之后以为在哪也不会用到23333333333,没想到今天网络赛居然出了.顺利在题面更改前A掉~~~(我觉得要不是我开机慢+编译慢+中间暂时死机,我还 ...

  6. HDU 5833 Zhu and 772002(高斯消元)

    题意:给n个数,从n个数中抽取x(x>=1)个数,这x个数相乘为完全平方数,求一共有多少种取法,结果模1000000007. 思路:每个数可以拆成素数相乘的形式,例如: x1 2=2^1 * 3 ...

  7. HDU 5833 Zhu and 772002 (数论+高斯消元)

    题目链接 题意:给定n个数,这n个数的素因子值不超过2000,从中取任意个数使其乘积为完全平方数,问有多少种取法. 题解:开始用素筛枚举写了半天TLE了,后来队友说高斯消元才想起来,果断用模板.赛后又 ...

  8. HDU - 5833: Zhu and 772002 (高斯消元-自由元)

    pro:给定N个数Xi(Xi<1e18),保证每个数的素因子小于2e3:问有多少种方案,选处一些数,使得数的乘积是完全平方数.求答案%1e9+7: N<300; sol:小于2e3的素数只 ...

  9. HDU 5833 Zhu and 772002 ——线性基

    [题目分析] 这题貌似在UVA上做过,高精度高斯消元. 练习赛T2,然后突然脑洞出来一个用Bitset的方法. 发现代码只需要30多行就A掉了 Bitset大法好 [代码] #include < ...

随机推荐

  1. pbfunc外部函数扩展应用-直接在Datawindow中生成QR二维码,非图片方式

    利用pbfunc外部函数在Datawindow中直接生成QR二维码,非图片方式.需要注意以下面几点: Datawindow的DataObject的单位必须为像素(Pixels). Datawindow ...

  2. 用css伪类实现提示框效果

    题目要求用css实现下图效果: 很明显难点就在那个多出去的三角形上,下面代码是用一个div来实现的,用到了伪类 : befor和 : after,使用这两个伪类活生生的在div之前和之后多出了&quo ...

  3. 管理系统的前端解决方案:Pagurian V1.3发布

    Pagurian 一个管理系统的前端解决方案, 致力于让前端设计,开发,测试,发布更简单. 功能简介 Pagurian 适用于Web管理级的项目 基于Sea.js遵循CMD规范,友好的模块定义,使业务 ...

  4. 关于ArcGIS10.0中的栅格计算中的函数

    版本升级确实很重要,在ArcGIS10.1中计算成功的,在10.0中出了问题. 问题 在进行栅格计算时,计算公式很简单,包括两个Ln函数: "-22.73 + 11.1 * Ln(5) + ...

  5. .NET破解之百度网盘批量转存工具

    在百度网盘上看到好的资源,总想转存到自己的网盘,加以整理.由于分享的规则原因,手动转存非常麻烦,于是百度批量转存工具.最先搜到的是小兵的百度云转存助手,无需注册,试用版用户一次只能操作10个,而捐助用 ...

  6. MS10-046漏洞测试

    这次用到MS10-046这个远程执行漏洞(Windows快捷方式LNK文件自动执行代码漏洞攻击) 命令: 1.   msfconsole    //启动MSF Metasploit 2.   sear ...

  7. thinkPHP学习笔记(1)

    现在对前端的要求越来越高了  基本上身为一个前端人员需要会一种后台语言,于是选择了当下流行的php.因为是自学对我这个不怎么懂代码的人来说还是有点难度的. 1.先看看thinkphp的目录结构 ├─T ...

  8. ad组策略和sharepoint office打开文档关系

    组策略管理器 组策略继承 新建组策略 更新组策略 服务器端 1.cmd命令:gpupdate /force 2.更新ad站点与服务,针对多台ad 客户端 1.cmd命令:gpupdate /force ...

  9. Android自动更新安装后显示‘完成’‘打开’按钮

    /** * 安装apk * * @param url */ private void installApk() { File apkfile = new File(apkFilePath); if ( ...

  10. iOS8以后 UISearchController的用法

    查了不少资料,都不太全,自己查看了apple文档,写了一份代码: 如下(只是界面): 1. 声明属性 @property (nonatomic, strong) UISearchController ...