UVA11542 高斯消元
2017-02-07
UVA11542 高斯消元:n个数,选几个数相乘,使积为平方数,求方案数。给每个数分解质因数,用质因数的指数mod 2作为未知数,每个数中包含该质因数的指数mod 2作为参数,列方程。
UVA11542 高斯消元:n个数,选几个数相乘,使积为平方数,求方案数。给每个数分解质因数,用质因数的指数mod 2作为未知数,每个数中包含该质因数的指数mod 2作为参数,列方程。(因为目的是为了每个质因数指数mod 2为0)
#include#include #include using std::swap; long long N,prime[100],pri_cnt; bool isprime[505]; long long x_cnt,pr_id[505]; typedef bool Matrix[105][105]; Matrix A; void getPrime() { for(long long i=2;i<=500;i++) if(!isprime[i]) { prime[pri_cnt++]=i; for(long long j=i*i;j<=500;j+=i) isprime[j]=1; } } void Init() { x_cnt=0; memset(pr_id,0,sizeof pr_id); memset(A,0,sizeof A); long long a; scanf("%lld",&N); for(long long i=1,k;i<=N;i++) { scanf("%lld",&a); k=0; while((a>500||isprime[a])&&a!=1) { if(a%prime[k]==0&&pr_id[prime[k]]==0) pr_id[prime[k]]=++x_cnt; while(a%prime[k]==0) { a/=prime[k]; A[pr_id[prime[k]]][i]^=1; } k++; } if(a!=1) { if(pr_id[a]==0) pr_id[a]=++x_cnt; A[pr_id[a]][i]^=1; } } } void Gauss() { long long r,c,n=x_cnt,m=N,mxr; for(r=1,c=1;r<=n&&c<=m;r++,c++) { for(mxr=r;!A[mxr][c]&&mxr<=n;mxr++); if(mxr>n){r--;continue;} if(mxr!=r)swap(A[mxr],A[r]); for(long long i=1;i<=n;i++) if(i!=r&&A[i][c]) for(long long j=1;j<=m;j++) A[i][j]^=A[r][j]; } long long ans=1LL<<(m-r+1); ans--; printf("%lld\n",ans); } int main() { long long T; scanf("%lld",&T); getPrime(); while(T--) { Init(); Gauss(); } return 0; }
相关文章
最新文章
- .Net Core权限认证基于Cookie的认证&授权.Scheme、P
- 设计模式 - 七大设计原则(四)- 合成复用原则与设
- 设计模式模式(四):建造者模式(生成器模式) -
- 程序结构设计理论(Android) - 树曲 - 博客园
- 通俗易懂设计模式解析——模板方法模式 - 小世界的
- ASP.NET Core 3.0 : 二十四. 配置的Options模式
- .Net MVC 提示未能加载文件或程序集 - 凉L - 博客园
- C# 多线程与高并发处理并且具备暂停、继续、停止功能
- Fundebug 微信小程序BUG 监控插件更新至 1.3.1,支
- BeautyWe.js 一套专注于微信小程序的开发范式 - 前
热点推荐