HDU 5833 Zhu and 772002 (高斯求元)

比赛的时候把三题更水的题做完之后,想此题想了三个多小时。尽管啥都想到了,奈何不懂高斯求元一说,后看此题最后最后通过人数达到400+,不是原题的话应该也没这么过分。

【邝斌模版代码】

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF  0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 100010
//#define MOD 1000000007
const long long MOD = 1000000007;
const int MAXN = 1805; //有equ个方程,var个变元。增广矩阵行数为equ,列数为var+1,分别为0到var
int a[MAXN][MAXN]; //增广矩阵
int x[MAXN]; //解集
int free_x[MAXN];//用来存储自由变元(多解枚举自由变元可以使用)
int free_num;//自由变元的个数
//返回值为-1表示无解,为0是唯一解,否则返回自由变元个数
int Gauss(int equ,int var)
{
    int max_r,col,k;
    free_num = 0;
    for(k = 0, col = 0 ; k < equ && col < var ; k++, col++)
    {
        max_r = k;
        for(int i = k+1; i < equ; i++)
        {
            if(abs(a[i][col]) > abs(a[max_r][col]))     
                max_r = i;
        }
        if(a[max_r][col] == 0)
        {
            k--;
            free_x[free_num++] = col;//这个是自由变元
            continue;
        }
        if(max_r != k)
        {
            for(int j = col; j < var+1; j++)
                swap(a[k][j],a[max_r][j]);
        }
        for(int i = k+1; i < equ; i++)
        {
            if(a[i][col] != 0)
            {
                for(int j = col; j < var+1; j++)
                    a[i][j] ^= a[k][j];
            }
        }
    }
    for(int i = k; i < equ; i++)   
        if(a[i][col] != 0)    return -1; //无解
    if(k < var) return var-k;//自由变元个数  //唯一解,回代
    for(int i = var-1; i >= 0; i--)
    {
        x[i] = a[i][var];
        for(int j = i+1; j < var; j++)    x[i] ^= (a[i][j] && x[j]);
    }
    return 0;   
}
int prime[330],k;
int vis[2005];
void gen_primes(int m)
{
    memset(vis, 0, sizeof(vis));
    k = 0;
    for (int i = 2; i < m; i++)
    {
        if (!vis[i])
        {
            prime[k++] = i;
            for (int j = i * i; j < m; j += i)
                vis[j] = 1;
        }
    }
}
int main()
{
    //get_prime();
    gen_primes(2000);
    int t,C = 1;
    scanf("%d", &t);
    while(t--)
    {
        int n;
        scanf("%d", &n);
        memset(a,0,sizeof(a));
        for(int i = 0; i < n; i++)
        {
            long long xx;
            scanf("%lld",&xx);
            for(int j = 0; j < k; j++)
                if(xx % prime[j] == 0)
                {
                    while(xx % prime[j] == 0)
                    {
                        xx /= prime[j];
                        a[j][i] ^= 1;
                    }
                }
        }
        int m = Gauss(k,n);
        long long ans = 1;
        for(int i = 0; i < m; i++)
            ans = ans * 2 % MOD;
        printf("Case #%d:\n",C++);
        printf("%lld\n",(ans-1+MOD)%MOD);

    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GG即时通讯系统GGTalk,包括客户端、服务端、数据库,可在广域网部署使用。支持:文字/语音/视频聊天,文件传送,离线文件,离线消息,视频会议,性能稳定,绝不是一个玩具或demo。GG即时通讯系统GGTalk 6.2 源码版 更新日志:2019-01-03PC版修复bug:更新组成员时,没有更新组的version;修复MySQL分页错误,以及查询聊天记录错误;Android版:增加好友在线状态、群聊等功能。已实现的功能:(01)注册、登录、查找用户、添加好友、好友列表。(02)自拍头像。(03)文字聊天、字体设置、GIF动态表情、窗口震动、截图、手写板、登录状态(在线、离开、忙碌、勿打扰、隐身)、输入提醒(04)群功能:创建群、加入群、退出群、群聊天(05)文件传送、文件夹传送(支持断点续传)(06)语音视频聊天(07)远程磁盘(08)远程协助(09)共享桌面(可以指定要共享的桌面区域)(10)可靠的P2P(11)网盘   (12)离线消息(13)离线文件(14)托盘闪动:跟QQ完全一样,当接收到消息时,托盘会闪动对应好友的头像。点击头像,将弹出与好友的聊天框。(15)最近联系人列表(16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。(17)聊天记录:支持本地保存和服务器端保存两种方式。(18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。(19)打开聊天窗口时,自动显示上次交谈的最后一句话。(20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入”的提示。(21)自动记录:GG2014会自动记录上次打开的主界面的位置、大小;最后一次打开的聊天窗口的大小;最后一次设定的字体的颜色、大小等。 (22)主窗体靠边自动隐藏。(23)录制视频聊天。(24)支持数据库(SqlServer2000/2005/2008),并可以通过配置在真实数据库和虚拟数据库之间自由切换。 (25)语音视频设备测试   (26)聊天消息加密
手机上的密码管理程序。<br><br>1.系统密码<br> 1).第一次进入本系统<br> 时系统密码为空,登录<br> 后请立即修改密码;<br> 2).数据交换功能中,<br> 系统导出数据到邮箱时<br> 以当前系统密码作为数<br> 据交换包文件密码;<br> 3).系统琐定后解锁所<br> 需要的密码即为该密码.<br>2.分类节点的展开与收缩<br> 1).选择分类后按摇按<br> 选择键使分类在展开与<br> 收缩状态间切换;<br> 2).手写笔点击分类前<br> +/-符号可展开/收缩<br> 已收缩/展开的分类节<br> 点;<br> 3).选择分类后,按摇<br> 按左向键收缩已展开的<br> 分类,按摇按右向键展<br> 开已收缩的分类.<br>3.项目明细信息查看途径 <br> 1).选择项目后按摇按<br> 选择键使项目进入明细<br> 信息显示状态,当再次<br> 按下该键后切换到正常<br> 状态;<br> 2).手写笔点击项目,<br> 手写笔离开后项目从明<br> 细信息状态自动切换到<br> 正常状态;<br> 3).按左软键"编辑项<br> 目"弹出项目编辑对话<br> 框.<br>4.移动分类或项目<br> 1).层内节点可进行上<br> 下位置移动;<br> 2).节点左移表示将节<br> 点移动到上一层即父节<br> 点层,节点右移表示将<br> 节点移动到上一兄弟节<br> 点的子节点层;<br> 3).在移动分类或项目<br> 状态下,按"Shift"后<br> 摇杆移动切换为密码树<br> 节点浏览模式,此时并<br> 不实质性地移动节点,<br> 再次按"Shift"之后恢<br> 复移动状态.<br>5.发送消息<br> 即向选定的联系人或电<br> 话号码发送所选择的项<br> 目信息.<br>6.数据交换<br> 1).设置<br> 程序利用因特网上的邮<br> 件服务器进行数据交换,<br> 顺利使用该功能的前提<br> 条件是你必须设置好你<br> 的邮箱帐号、POP3服务<br> 器及SMTP服务器.<br> 2).导出<br> 将选择的信息打包成加<br> 密数据文件并存储于你<br> 提供的邮箱地址当中,<br> 以供"移动密码箱/PC密<br> 码箱"程序导入数据时<br> 使用.<br> 3).导入<br> 从你提供的邮箱地址选<br> 择"移动密码箱/PC密码<br> 箱"程序导出数据的文<br> 件,下载后选择要导入<br> 的信息并选择要导入的<br> 位置后,将进行导入处<br> 理.<br>7.更多帮助请访问"关于"<br> 页面中的Blog地址.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值