HDU-5833-Zhu and 772002【2016CCPC网络赛】【高斯消元】

原创 2016年08月30日 12:25:55

1002-Zhu and 772002


Problem Description
Zhu and 772002 are both good at math. One day, Zhu wants to test the ability of 772002, so he asks 772002 to solve a math problem.

But 772002 has a appointment with his girl friend. So 772002 gives this problem to you.

There are n numbers a1,a2,…,an. The value of the prime factors of each number does not exceed 2000, you can choose at least one number and multiply them, then you can get a number b.

How many different ways of choices can make b is a perfect square number. The answer maybe too large, so you should output the answer modulo by 1000000007.

Input
First line is a positive integer T , represents there are T test cases.

For each test case:

First line includes a number n(1≤n≤300),next line there are n numbers a1,a2,…,an,(1≤ai≤1018).

Output
For the i-th test case , first output Case #i: in a single line.

Then output the answer of i-th test case modulo by 1000000007.

Sample Input
2
3
3 3 4
3
2 2 2

Sample Output
Case #1:
3
Case #2:
3

题目链接:HDU-5833

题目大意:给出n个数字,问有多少种方式取(1~n)个数字使得成为一个完美平方数

题目思路:这道的原题是sgu-200,另外白皮书上也有代码。

求完全平方数,质因子的范围也知道,所以我们可以对每个质因子列出一个模意义下的方程(mod 2),然后求变元的个数就行了。

ans=2^num-1(去掉全部为0)

如何求变元的个数,就是在高斯消元的时候对于一个未知数xi,如果后面的方程xi的系数都为0的话,那么这个就是一个变元。

参考博客:here

以下是代码:

#include <bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;
#define maxn 2100
ll vis[maxn];
ll prime[maxn]={0};
ll a[maxn];
ll fc[maxn][maxn]={{0}};
int n;
int pnum;
int get_primes(int m) {
    memset(vis, 0, sizeof(vis));
    int cnt = 1; //注意
    for (int i = 2; i < m; i++) {
        if (!vis[i]) {
            prime[cnt++] = i;
            for (int j = i * i; j < m; j += i)
                vis[j] = 1;
        }
    }
    return cnt;
}
void change(ll k,ll g)
{
    for(int i = 1; i <= pnum; )
    {
        if(k % prime[i] == 0)
        {
            fc[i][g] ^= 1;
            k /= prime[i];
        }
        else i++;
    }
    return;
}
ll gauss()
{
    ll g = 0;
    int i,j;
    for(j = 1; j <= n && g < pnum; j++)
    {
        for(i = g + 1; i <= pnum; i++)
            if(fc[i][j] == 1)
                break;
        if(i <= pnum)
        {
            g++;
            for(int p = j; p <= n; p++)
                swap(fc[g][p],fc[i][p]);
            for(int p = g + 1; p <= pnum; p++)
            {
                if(fc[p][j] == 1)
                {
                    for(int q = j; q <= n; q++)
                        fc[p][q] ^= fc[g][q];
                }
            }
        }
    }
    return g;
}
ll qpow(ll a,ll b,ll m)
{
    ll ans = 1;
    while(b){
        if(b & 1){
            ans = (ans * a) % m;
            b--;
        }
        b /= 2;
        a = a * a % m;
    }
    return ans;
}
int main(){
    int cas = 1;
    int t;
    cin >> t;
    get_primes(2100);
    pnum = 303;
    while(t--)
    {
        memset(fc,0,sizeof(fc));
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> a[i],change(a[i],i);

        int r = gauss();  //求变元个数

        ll ans = qpow(2, (ll)(n - r), mod) - 1;
        printf("Case #%d:\n%lld\n",cas++,ans);
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

2016CCPC网络赛个人总结

今天下午是2016年的CCPC中国大学生程序设计竞赛的网络赛。几百个学校共计一千多个队参赛。在HDOJ举行。12点开始以后,我们马上看了第一题,嘻嘻哈哈两个星球有着不同的公转周期。给出一个时间。当过了...
  • ACM_Frank
  • ACM_Frank
  • 2016年08月14日 18:39
  • 5926

HDU5833(2016CCPC网赛)——Zhu and 772002(异或方程组,素数分解)

Zhu and 772002 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...
  • say_c_box
  • say_c_box
  • 2016年08月15日 10:21
  • 411

2016CCPC网络赛赛后总结——回顾与反思

今天的比赛是特别遗憾的一场,如果能多出一题,或许是一个相反的场面,但是,实力就到这里了,瓶颈了,再假设如果毫无意义,一切都是我们平时不严格的训练和懈怠自己造成的,或许说起来难听,我们一点也不遗憾,是“...
  • bobodem
  • bobodem
  • 2016年08月15日 19:30
  • 4362

acm网络选拔赛原则和晋级规则

acm网络选拔赛原则和晋级规则 选拔原则: 1. 教练是参加队伍所代表学校的正式教师,教练必须保证所有队员符合本规则的规定; 2. 每只队伍最多有三名正式参赛队员(本赛点不设置替补); ...
  • threedonkey
  • threedonkey
  • 2013年11月18日 16:02
  • 3882

靠右行驶规则的元胞自动机交通流建模(cellular automata,CA),2014美国数学建模竞赛(MCM)A题

在这里我并不想说多少和美国数学建模(MCM)相关的东西,我只想谈谈元胞自动机(Cellular automata,后面简称CA)以及其在数学建模中交通流模型中的作用和实现方法。CA的基本知识,在这里不...
  • tinymilk
  • tinymilk
  • 2014年02月13日 02:15
  • 3904

2016 CCPC 中国大学生程序设计竞赛 合肥赛区 总结

今天是2016年10月19日… 比赛完了已经过了3天. 今天想起我的总结还没写..这次真的很有幸来到合肥赛区比赛 也感谢教练还是对我们的相信 我对合肥赛区并没有报太大的希望我感觉这次可能有3个...
  • zzz805
  • zzz805
  • 2016年10月19日 16:24
  • 2499

LTE-网络架构及网元实体

LTE网络特点 与传统3G网络比较,LTE的网络结更加简单扁平,降低组网成本,增加组网灵活性,主要特点表现在: 网络扁平化使得系统延时减少,从而改善用户体验,可开展更多业务; 网...
  • chenglove1314
  • chenglove1314
  • 2014年09月16日 16:24
  • 2085

2016CCPC网选 1002:Zhu and 772002(求解矩阵秩)

http://acm.hdu.edu.cn/showproblem.php?pid=5833 问题概述:输入n个数,可以从当中选出一些数,使得这些数乘积为一个完全平方数,求出总共有多少种不同选法 (不...
  • Jaihk662
  • Jaihk662
  • 2016年08月15日 16:45
  • 355

2017年第0届浙江工业大学之江学院程序设计竞赛决赛 L: qwb与整数对 [离线]【思维】

题目链接:http://115.231.222.240:8081/JudgeOnline/problem.php?cid=1005&pid=11 ——————————————————————————...
  • qq_33184171
  • qq_33184171
  • 2017年06月03日 02:55
  • 485

2016年 中国大学生程序设计竞赛合肥赛区(ccpc)解题报告

合肥赛区:(现场四题,赛后补到七题) ProblemC: 题意:给一棵nn个节点的树,边有权,为0或1。在树上进行游戏,游戏开始时会确定一个节点为根,两人交替进行操作。一方操作时,选一个非根节点uu满...
  • hit_buxiaoyu
  • hit_buxiaoyu
  • 2016年12月20日 23:03
  • 519
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU-5833-Zhu and 772002【2016CCPC网络赛】【高斯消元】
举报原因:
原因补充:

(最多只允许输入30个字)