HDU 5833 (2016大学生网络预选赛) Zhu and 772002(高斯消元求齐次方程的秩)
网络预选赛的题目……比赛的时候没有做上,确实是没啥思路,只知道肯定是整数分解,然后乘起来素数的幂肯定是偶数,然后就不知道该怎么办了…
最后题目要求输出方案数,首先根据题目应该能写出如下齐次方程(从别人那里盗的……):
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(高斯消元求齐次方程的秩)的更多相关文章
- hdu 5833 Zhu and 772002 高斯消元
Zhu and 772002 Problem Description Zhu and 772002 are both good at math. One day, Zhu wants to test ...
- 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.输出 ...
- HDU - 5833: Zhu and 772002 (高斯消元-自由元)
pro:给定N个数Xi(Xi<1e18),保证每个数的素因子小于2e3:问有多少种方案,选处一些数,使得数的乘积是完全平方数.求答案%1e9+7: N<300; sol:小于2e3的素数只 ...
- hdu 5955 Guessing the Dice Roll 【AC自动机+高斯消元】
hdu 5955 Guessing the Dice Roll [AC自动机+高斯消元] 题意:给出 n≤10 个长为 L≤10 的串,每次丢一个骰子,先出现的串赢,问获胜概率. 题解:裸的AC自动机 ...
- [ACM] hdu 4418 Time travel (高斯消元求期望)
Time travel Problem Description Agent K is one of the greatest agents in a secret organization calle ...
- hdu 3992 AC自动机上的高斯消元求期望
Crazy Typewriter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 2262 高斯消元求期望
Where is the canteen Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- hdu 4870 rating(高斯消元求期望)
Rating Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- hdu 4418 高斯消元求期望
Time travel Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- 在windows上部署使用Redis(摘录)
下载Redis 在Redis的官网下载页上有各种各样的版本,我这次是在windows上部署的,要去GitHub上下载.目前的是2.8.12版的,直接解压,在\bin\release 目录下有个压缩包, ...
- ios中获取当前屏幕尺寸的方法
//获取当前屏幕尺寸 CGRect screenFrame = [UIScreen mainScreen].bounds; int screenWidth = screenFrame.size.wid ...
- SASL - 简单认证和安全层
转自:http://blog.csdn.net/id19870510/article/details/8232509 SASL - 简单认证和安全层 SASL是一种用来扩充C/S模式验证能力的机制认证 ...
- POJ 1696 Space Ant 极角排序(叉积的应用)
题目大意:给出n个点的编号和坐标,按逆时针方向连接着n个点,按连接的先后顺序输出每个点的编号. 题目思路:Cross(a,b)表示a,b的叉积,若小于0:a在b的逆时针方向,若大于0a在b的顺时针方向 ...
- mahout与nosql的两幅经典图形
- WebService测试方案
1.WebService简介 WebService是一种革命性的分布式计算技术,本质上就是网络上可用的API,可以直接在网络环境调用的方法. WebService常用的框架有axis.xfire.cx ...
- leetcode70
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- 深入浅出requireJS-1
我们都知道,虽然我们可以通过原型和继承来使javascript面向对象.但是,当js代码和逻辑过多时,代码的维护和扩展会变的很不方便.这时,nodejs做的非常好,但是在浏览器端模块化的js编程一直都 ...
- js 条件判断放大字体
<html> <head> <meta charset="utf-8" /> <title></title> <s ...
- JRE与JDK
Java源代码是以*.java的纯文本文件,可以使用任何文本编辑器编写,但不可以执行. JDK是Java语言的开发包,可以将*.java文件编译成可执行Java文件. 可执行Java程序需要JVM才可 ...