Description

Zyh独自一人在街上漫步。Zyh相信不久后应该就可以和她一起漫步,可是去哪里寻找那个她呢?Zyh相信每个人都有一个爱情的号码牌,这个号码牌是一个n*n的矩阵。
每个人都要在矩阵中选择若干个元素,使得每行每列都有奇数个数被选中,且选中的数字的乘积是完全平方数。每当选出了这若干个元素,他/她就能找到那个她/他。
Zyh想知道对于一个号码牌有多少种选择的方法,使得zyh能够不再孤独。由于这个数字很大,只要输出对1,000,000,007取模后的余数即可。

Data Constraint

第一类:对于30%的数据 n<=4 Aij<=10
第二类:对于50%的数据 n<=10 n*n个数分解质因数后的不同素数个数不超过5个
第三类:对于80%的数据 n<=15 Aij<=1000000000
第四类:对于100%的数据 n<=30 Aij<=1000000000
在第三类(不属于第二类)的数据中 有10%的数据满足Aij都为同一个素数

Solution

这是我第一次打高斯消元,可一上来就是一道高斯消元异或方程组……
我们可以把所有约束变成一道道异或方程。
1、对于每行每列都有奇数个数被选中的约束。我们可以把第i行的每个未知数配上一个系数1。举个例子,第i行的式子为x(i−1)∗n+1x_{(i-1)*n+1}^x(i−1)∗n+2x_{(i-1)*n+2}^……^xi∗n==1x_{i*n}==1。列的情况类似。
2、对于最终要求完全平方,我们可以拆解成n个质因数的指数为偶数。所以我们可以将n*n个数每个未知数的系数为它最多是该质因数的几次幂的倍数,例如36就是2的2次幂的倍数,同时36是3的2次幂的倍数。每个质因数也同样可以列出一个式子。
最后只要将这些高斯消元一下即可。

一些小问题

1、要注意,我们找不到当前第i位为1的式子时,我们可以将一条无意义式子(即类似0^0^0^……^0=0)移上第i位。
2、式子有可能无解。当最后你发现存在式子(类似0^0^0^……^0=1)时,则为无解。因为你不能什么都不选。

Code

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=2005,maxn1=35,mo=1e5+5,mo1=1e9+7;
int f[maxn][1000],n,i,t,j,k,l,a[maxn1][maxn1],num,h[mo],b[maxn],x,y,c[maxn],d[maxn],ans,p;
void hash(int x){int t=x%mo;while (h[t]!=x && h[t]) t=(t+1)%mo;if (!h[t]) h[t]=x,b[++b[0]]=x;
}
ll mi(int x){if (x==1) return 2;if (!x) return 1;ll t=mi(x/2);if (x%2) return t*t%mo1*2%mo1;return t*t%mo1;
}
int main(){
//  freopen("data.in","r",stdin);scanf("%d",&n);for (i=1;i<=n;i++)for (j=1;j<=n;j++)scanf("%d",&a[i][j]);t=a[1][1];k=0;for (i=1;i<=n;i++)for (j=1;j<=n;j++)if (a[i][j]==t) k++;if (k==n*n && t>1 && (n%2)){printf("0\n");return 0;}for (i=1;i<=n;i++){for (j=(i-1)*n+1;j<=i*n;j++)f[i][j]=1;f[i][n*n+1]=1;}num=n;for (i=1;i<=n;i++){++num;for (j=i;j<=n*n;j+=n)f[num][j]=1;f[num][n*n+1]=1; }for (i=1;i<=n;i++)for (j=1;j<=n;j++){t=sqrt(a[i][j]);l=a[i][j];for (k=2;k<=t;k++){if (k*k>l) break;if (l%k) continue;hash(k);while (!(l%k)) l/=k;}   if (l>1) hash(l);}for (k=1;k<=b[0];k++){++num;for (i=1;i<=n;i++)for (j=1;j<=n;j++){t=a[i][j];l=0;while (!(t%b[k])) t/=b[k],l++;f[num][(i-1)*n+j]=l%2;}f[num][n*n+1]=0;}while (num<n*n){++num;for (j=1;j<=n*n+1;j++)f[num][j]=f[1][j];}for (j=1;j<=n*n;j++){for (i=j;i<=num;i++)if (f[i][j]){for (k=j;k<=n*n+1;k++)swap(f[i][k],f[j][k]);break;}for (i=j+1;i<=num;i++){if (!f[i][j]) continue;for (k=j;k<=n*n+1;k++)f[i][k]=(f[i][k]^f[j][k]);}if (!f[j][j]){t=1e9;for (i=j;i<=num;i++){k=j;while (!f[i][k] && k<=n*n) k++;if (k==n*n+1) k=j-1;if (k<t) t=k,p=i;}for (k=j;k<=n*n+1;k++)swap(f[p][k],f[j][k]);}}for (j=num;j>=1;j--){t=f[j][n*n+1];if (!t) continue;for (k=1;k<=n*n;k++)if (f[j][k]) break;if (k==n*n+1){printf("0\n");return 0;}}for (j=n*n;j>=1;j--){t=f[j][n*n+1];for (k=j+1;k<=n*n;k++)t=(t^(f[j][k]*c[k]));if (t) c[j]=1;else if (!f[j][j]) ans++;}ans=mi(ans);printf("%d\n",ans);
}

【JZOJ 3823】【NOIP2014模拟9.9】遇见相关推荐

  1. jzoj2702. 探险jzoj3917. 【NOIP2014模拟11.2A组】福慧双修

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  2. JZOJ 3823【NOIP2014模拟9.9】遇见

    Description Zyh独自一人在街上漫步.Zyh相信不久后应该就可以和她一起漫步,可是去哪里寻找那个她呢?Zyh相信每个人都有一个爱情的号码牌,这个号码牌是一个n*n的矩阵. 每个人都要在矩阵 ...

  3. JZOJ 3823. 【NOIP2014模拟9.9】遇见

    题目 Description Zyh独自一人在街上漫步.Zyh相信不久后应该就可以和她一起漫步,可是去哪里寻找那个她呢?Zyh相信每个人都有一个爱情的号码牌,这个号码牌是一个n*n的矩阵. 每个人都要 ...

  4. JZOJ 3809. 【NOIP2014模拟8.25】设备塔

    Description 为了封印辉之环,古代塞姆利亚大陆的人民在异空间中建造了一座设备塔. 简单的说,这座设备塔是一个漂浮在异空间中的圆柱体,圆柱体两头的圆是计算核心,而侧面则是 传输信息所用的数据通 ...

  5. JZOJ 3815. 【NOIP2014模拟9.7】克卜勒

    Description 一闪一闪亮晶晶/好像你的身体/藏在众多孤星之中/还是找得到你/挂在天上放光明/反射我的孤寂/提醒我/我也只是一颗寂寞的星星/oh~/浩瀚的世界里/更迭的人海里/和你互相辉映/而 ...

  6. JZOJ 3775. 【NOIP2014模拟8.15】因子的排列

    Description 一天,小B学习了分解质因数的相关内容.他发现,一个数的质因子可以有许多不同的排列方式,例如20=2*2*5=2*5*2=5*2*2,那么小B认为20的质因子有3种不同的排列方式 ...

  7. JZOJ 3899. 【NOIP2014模拟】逻辑的连通性

    Description 假如有命题p 一定能推出命题q,则称p 是q 的充分条件,q 是p 的必要条件. 特别的,当p 既是q 的充分条件,又是q 的必要条件时,称p 和q 互为充要条件 现在有n 个 ...

  8. JZOJ 3731. 【NOIP2014模拟7.10】庐州月

    Description [引子] 桥上的恋人入对出双 桥边红药叹夜太漫长 月也摇晃人也彷徨 乌蓬里传来了一曲离殇 庐州月光洒在心上 月下的你不复当年模样 太多的伤难诉衷肠 叹一句当时只道是寻常 庐州月 ...

  9. JZOJ 3885. 【长郡NOIP2014模拟10.22】搞笑的代码

    Description 在OI界存在着一位传奇选手--QQ,他总是以风格迥异的搞笑代码受世人围观 某次某道题目的输入是一个排列,他使用了以下伪代码来生成数据 while 序列长度< n do { ...

最新文章

  1. 【AI不惑境】模型压缩中知识蒸馏技术原理及其发展现状和展望
  2. 巧用事件查看器维护服务器安全
  3. centos上那装qq2012
  4. Java非对称加密KeyPairGenerator类
  5. 适用所有服务器的全站301重定向跳转教程
  6. StringBuilder与StringBuffer的一点笔记
  7. 安装django框架:虚拟环境准备 框架安装
  8. Theory: If statement(理论:如果语句)
  9. 心有猛虎,细嗅蔷薇。—第二十六天
  10. JavaScript星星连线技巧
  11. 类和对象(Java)
  12. [Jzoj] 1285. 奶酪厂
  13. java verify_JAVA结合testng断言verify(断言失败不中断继续执行)
  14. springboot使用poi实现Excel模板的下载功能
  15. ES6-正则的扩展-u、y修饰符
  16. 文本溢出处理显示省略号
  17. element-ui查看大图
  18. 联想魔改BIOS详细最优设置
  19. 手机软件功能测试视频直播,奇秀直播怎么样 奇秀视频直播平台使用图文教程...
  20. 德国光伏风电如何做到高比例消纳?

热门文章

  1. 江苏省计算机等级考试一级b,计算机等级考试一级B辅导
  2. R 语言 安装DESeq2,dplyr 包遇到报错的彻底解决方案
  3. 教你去除开机root字样(酷派大神F2、酷派高通平台手机)
  4. hdfs orc格式_HIVE存储格式ORC、PARQUET对比
  5. 如何快速开发一个古诗词小程序?
  6. PHP漂流瓶代码,【按键精灵】连信打招呼、漂流瓶源码
  7. 关于VPN的一些总结和理解
  8. php 壁纸源码_牛叉PHP在线壁纸图片开源系统部署和源码
  9. 记录下诺瓦科技笔试(软开)
  10. 区块链技术用于商品溯源