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

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

  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. 分享到QQ空间、新浪微博、腾讯微博和人人网

    function shareys(type, url, title, img, content) { switch (type) { case "sina": url = &quo ...

  2. Chapter 15_3 使用环境

    创建模块的基本方法的缺点在于,忘记使用local,很容易就污染全局空间. “函数环境”是一种有趣的技术,它能够解决上面的问题.就是让模块的主程序块独占一个环境. 这样不仅它的所有函数可以共享这个tab ...

  3. Chapter7 迭代器

    结合泛型for的所有功能,写出更加简单,高效的迭代器. 1.迭代器和closure 迭代器是一种可以遍历集合中所有元素的机制.在Lua中用函数去表示它. 每调用一次,就返回下一个元素. 迭代器在两次成 ...

  4. def语句常见错误

    自觉不才,使用def语句时容易出现以下错误, 参考: 习题—25 http://www.2cto.com/shouce/Pythonbbf/ex25.html def add(): print &qu ...

  5. java的静态方法的使用

    静态的方法和属性,你可以这么理解,就是所有对象公用的,比如一个属性是这样定义的: private static String name; 那么他的意思就是说,因为他是静态的,我所有的对象的name属性 ...

  6. mysql表备份及还原

    备份 导出数据库所有表结构 ? 1 mysqldump -uroot -ppassword -d dbname > db.sql 导出数据库某个表结构 ? 1 mysqldump -uroot ...

  7. C++设计模式-参考资料

    设计模式实例讲解: http://www.cnblogs.com/jiese/tag/ http://www.cnblogs.com/wanggary/category/294620.html 设计模 ...

  8. cocos2d-x 混合模式

    在OpenGL(ES),使用glBlendFunc函数实现实现混合模式,cocos2d-x中可以使用BlendFunc. 什么是颜色混合?简单来说就是将RGBA中的A,经行操作处理.具体一点,就是把某 ...

  9. android mediaplayer

  10. POJ 2516 Minimum Cost

    每个物品分开做最小费用最大流. #include<cstdio> #include<cstring> #include<cmath> #include<vec ...