网络预选赛的题目……比赛的时候没有做上,确实是没啥思路,只知道肯定是整数分解,然后乘起来素数的幂肯定是偶数,然后就不知道该怎么办了…

  最后题目要求输出方案数,首先根据题目应该能写出如下齐次方程(从别人那里盗的……):

  a11*x1  ^  a12*x2  ^  ...  ^  a1n*xn=0

  a21*x1  ^  a22*x2  ^  ...  ^  a2n*xn=0

  ...

  an1*x1  ^  an2*x2  ^  ...  ^  ann*xn=0,Aij表示选的第j个数的第i个质数(可能有些人跟我有一样的疑问,为什么不是第i个数的第j个质数呢,这是为了方便消元计算),xi为1或者0,代表数选和不选。

  所以这个问题就化成了该方程有几个解的问题,该方程的特征矩阵有303行,n列,因为1-2000之间一共有303个素数,实际可以省略用不到的那些。

  然后,学过线性代数的童鞋都知道,当它的特征矩阵的秩是n的时候,该方程有唯一解,就是0解,所以当时我们求出秩来以后,如果秩是r且r < n,也就意味着有n-r个0行,同时意味着,它与其它行线性相关,也就是这一行不影响答案,有选和不选两种情况,一共就有2的(n-r)次方 种情况,求秩的方法用高斯消元的模板,类比成异或就可以了,当时我还自己写了一个消元的函数,发现不对……还是贴的人家的模板。

  代码及注释如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
#define N 305
#define mod 1000000007
LL a[N];
int prime[N],tot,n,m;
int fenjie[N][N],zhuan[N][N];
bool yes(int x)
{
for(int i = ; i*i <= x; i++)
{
if(x%i == ) return false;
}
return true;
}
void Make_P()///暴力版素数表,实在懒得改……
{
tot = ;
for(int i = ; i <= ; i++)
{
if(yes(i)) prime[tot++] = i;
}
}
void FenJie()///质因数分解
{
memset(fenjie,,sizeof(fenjie));
m = -;
for(int i = ; i < n; i++)
{
LL tmp = a[i];
for(int j = ; j < tot; j++)
{
while(tmp % prime[j]==)
{
fenjie[j][i]++;
tmp /= prime[j];
m = max(m,j);///取一个最大的j值即可
}
fenjie[j][i] %= ;
if(tmp == ) break;
}
}
m++;
}
int Rank()///高斯消元求秩[j][i]的形式派上了用场
{
int i=,j=,k,r,u;
while(i < m && j < n)
{
r = i;
for(k=i; k<m; k++)
{
if(fenjie[k][j])
{
r=k;
break;
}
}
if(fenjie[r][j])
{
if(r != i)
for(k=; k <= n; k++)swap(fenjie[r][k],fenjie[i][k]);
for(u=i+; u<m; u++)
if(fenjie[u][j])
for(k=i; k<=n; k++)
fenjie[u][k]^=fenjie[i][k];
i++;
}
j++;
}
return i;
} int mypow(int x,int y)
{
int res = ;
for(int i = ; i <= y; i++)
{
res = ((x%mod)*(res%mod)) % mod;
}
return res;
}
int Slove()
{
int mi = n-Rank();
return (mypow(,mi) - ) % mod;
}
int main()
{
// freopen("in1.cpp","r",stdin);
int t,ca=;
Make_P();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i = ; i < n; i++)
{
cin>>a[i];
}
FenJie();
printf("Case #%d:\n",++ca);
cout<<Slove()<<endl;
}
return ;
}

HDU 5833 (2016大学生网络预选赛) Zhu and 772002(高斯消元求齐次方程的秩)的更多相关文章

  1. hdu 5833 Zhu and 772002 高斯消元

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

  2. hdu 5755 2016 Multi-University Training Contest 3 Gambler Bo 高斯消元模3同余方程

    http://acm.hdu.edu.cn/showproblem.php?pid=5755 题意:一个N*M的矩阵,改变一个格子,本身+2,四周+1.同时mod 3;问操作多少次,矩阵变为全0.输出 ...

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

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

  4. hdu 5955 Guessing the Dice Roll 【AC自动机+高斯消元】

    hdu 5955 Guessing the Dice Roll [AC自动机+高斯消元] 题意:给出 n≤10 个长为 L≤10 的串,每次丢一个骰子,先出现的串赢,问获胜概率. 题解:裸的AC自动机 ...

  5. [ACM] hdu 4418 Time travel (高斯消元求期望)

    Time travel Problem Description Agent K is one of the greatest agents in a secret organization calle ...

  6. hdu 3992 AC自动机上的高斯消元求期望

    Crazy Typewriter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. hdu 2262 高斯消元求期望

    Where is the canteen Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  8. hdu 4870 rating(高斯消元求期望)

    Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  9. hdu 4418 高斯消元求期望

    Time travel Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. Scala Tuple类型

    Tuple可以作为集合存储不同类型的数据,初始化实例如下: val tuple = (1,3,3.14,"aa") val third = tuple._3 Tuple 下标访问从 ...

  2. 华硕笔记本怎么进入PE之前的BIOS设置

    1.先要制作一个U盘的PE启动盘,建议使用WIN8 PE 2.将制作好的PE启动盘接上电脑,开机按F2键进入BIOS ,先将[Secure]菜单下[Secure Boot Control]选项设置为[ ...

  3. js中两个感叹号的原理与用法分析(转载记录没找到原帖)

    var foo; alert(!foo);//undifined情况下,一个感叹号返回的是true; alert(!goo);//null情况下,一个感叹号返回的也是true; var o={flag ...

  4. 获取当前设备的IP地址

    头文件: #import <ifaddrs.h> #import <arpa/inet.h> #import <net/if.h> 宏定义: #define IOS ...

  5. iis本地无法通过ip地址访问网站

    防火墙等通通检查过没有发现问题,最后发现是我安装了一款adsafe的广告过滤软件捣的鬼,此软件设置界面没有这样的设置条款,估计是默认的配置,退出后,就ok了.

  6. js上拉跳转原理

    今天遇到一个需要上拉跳转的地方,其原理跟上拉加载有点类似,代码如下 window.onscroll = function(){ if(getScrollTop() + getClientHeight( ...

  7. tomcat的几种配置方式(常用)

    https://www.baidu.com   url www.baidu.com 主机名 baidu.com 域名 第一种 放在webapp目录下 也可以放在ROOT 根目录下 访问路径 IP:端口 ...

  8. nmon命令用法

    用途 以交互方式显示本地系统统计信息并以记录方式记录系统统计信息. 语法 交互方式: nmon [ -h ] nmon [ -s < seconds > ] [ -c < count ...

  9. C# var 隐式类型 var 用法 特点

    var 关键字是C# 3.0 开始,在方法范围中声明的变量: var有以下特点: * 1.var在编译器编译的时候根据初始值推断出其的类型          * 2.不能赋值除了初始值类型之外的其他类 ...

  10. hibernate对象的状态以及生命周期

    瞬时状态:session中没有,数据库中没有 持久状态:session中有,数据库中有 游离状态:session中没有,数据库中有 get和load都是用来提取数据的 get和load的区别: get ...