【2016-CCPC-B】高斯消元(Zhu and 772002,hdu 5833)

本文介绍了一种利用质因数分解和高斯消元法解决特定数学问题的算法实现。通过质因数分解获取每个输入整数的质因数,并使用高斯消元法求解线性方程组,最终计算出特定形式的解。文章提供了一个完整的C++程序示例,包括初始化质数表、进行质因数分解、实施高斯消元等步骤。

http://blog.youkuaiyun.com/chy20142109/article/details/52206558


#include<bits/stdc++.h>
#define maxn 350
using namespace std;

typedef long long ll;
const ll mod=1000000007;
int n;
int p[2000];
int cnt;
int jz[maxn][maxn];

void init()
{
    for(int i=2;i<=2000;i++)
    {
        bool zhi=true;
        for(int j=2;j*j<=i;j++)
            if(i%j==0)
            {
                zhi=false;
                break;
            }
        if(zhi) p[i]=++cnt;
    }
}

ll mypow(ll x,ll n)
{
    ll ret=1;
    while(n)
    {
        if(n&1) ret=(ret*x)%mod;
        x=(x*x)%mod;
        n>>=1;
    }
    return ret;
}

int solve()
{
    int i,j;
    i=j=1;
    while(i<=cnt&&j<=n)
    {
        int r=i;
        while(r<=cnt&&!jz[r][j]) r++;
        if(r<=cnt)
        {
            if(r!=i) for(int k=j;k<=n;k++) swap(jz[r][k],jz[i][k]);
                for(int k=i+1;k<=cnt;k++)
                    if(jz[k][j])
                        for(int u=j;u<=n;u++)
                            jz[k][u]^=jz[i][u];
            i++;
        }
        j++;
    }
    return i;
}
int main()
{
    init();
    int T;
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
    {
        scanf("%d",&n);
        ll A;
        memset(jz,0,sizeof(jz));
        for(int j=1;j<=n;j++)
        {
            scanf("%I64d",&A);
            for(int k=2;k*k<=4000000&&k*k<=A;k++)
            {
                while(A%k==0)
                {
                    jz[p[k]][j]^=1;
                    A/=k;
                }
            }
            if(A!=1) jz[p[A]][j]^=1;
        }
        printf("Case #%d:\n%I64d\n",i,mypow(2,n-solve()+1)-1);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值