(HDU)5833 - Zhu and 772002 【高斯消元】

系规备考论文:论IT服务规划设计 阅读详情

Zhu and 772002

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1800    Accepted Submission(s): 625


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
 

Author
UESTC


题意:给你n个数字,它们的质因数不超过2000,问从n个数中至少选取1个数,它们的乘积是完全平方数的情况有多少种,结果对1000000007取模。


思路:

训练指南原题改编,P160。下为书上讲解:

“不含大于2000的素因子”提示我们考虑每个数的唯一分解式,用01向量表示—个数, 再用n个01变量xi来表示我们的选择,其中xi=1表示要选第i个数,xi=0表示不选它,则可对每个素数的幂列出一个模2的方程。 
这话听起来比较抽象,让我们分析一下题目中的例子。4个整数4,6,10,15的素因子只 有2, 3, 5这3种,首先把这些整数写成01向量的的形式,即4=22∗30∗50,即(2,0,0);6=21∗31∗50,即(1,1,0);10=21∗30∗51,即(1,0,1);15=20∗31∗51,即(0,1,1)。 
选出来的数乘积为22x1+x2+x3∗3x2+x4∗5x3+x4。如果要让这个数是完全平方数,每个幂都应该是偶数,即

⎧⎩⎨⎪⎪x2+x3≡0(mod2)x2+x4≡0(mod2)x3+x3≡0(mod2)

注意,这也是一个线性方程组,只是代数系统变成了Z2(模2的剩余系)。可是第一 个方程里的2x1不见了。这是因为2x1总是偶数,所以没必要写在方程里。同理,3x1会变成x1,任意变量的系数非0即1。还可以把这个方程组看成是如下xor方程组
⎧⎩⎨⎪⎪x2xorx3≡0x2xorx4≡0x3xorx3≡0

需要求解方程组解的组数。可以求秩,即求到自由变元的个数。xor方程组是很好消元的,因为不需要做乘法和除法,只需要做xor;每次也不需要找 绝对值最大的系数(每个系数不是0就是1),任意一个系数为1即可实现消元。 
最后,假设自由变量有f个,则线性方程组的解共有2f个,因为每个自由变量可以取0和1。比如,刚才的方程组对应的增广矩阵消元后为 
⎡⎣⎢0001101010|01|01|0⎤⎦⎥⇒⎡⎣⎢0001001100|01|00|0⎤⎦⎥

有两个自由变量x1和x4,有两个有界变量x2和x3,因此—共有22=4种选法。注意,本题不允许一个整数都不选,因此最终答案需要减1。

换句话说,我们需要做的就是对给的数做素数分解,因为素数大小不超过2000,2000以内素数有303个,所以开个二维数组,记录每个题给数的素数因子个数,个数偶数记为0,奇数记为1(素数分解时不断异或1就行了)。得到二维数组实际就是系数矩阵。求矩阵的秩就可以。高斯消元的模板。


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <iomanip>
#include <string>

using namespace std;
const int MAXN=305;
const int oo=1000000007;
typedef int Matrix[2107][2107];
typedef long long LL;
Matrix A;
int ra_nk(int m,int n)//A是异或方程组系数矩阵 返回秩
{
    int i=0,j=0,k,r,u;
    while(i<m&&j<n)
    {
        r=i;
        for(int k=i;k<m;k++)
        {
            if(A[k][j]) { r=k;break; }
        }
        if(A[r][j])
        {
            if(r!=i) for(k=0;k<=n;k++) swap(A[r][k],A[i][k]);
            //消元后第i行的第一个非0列是第j列,且第u>i行的第j列均为0
            for(u=i+1;u<m;u++) if(A[u][j])
                for(k=i;k<=n;k++) A[u][k]^=A[i][k];
            i++;
        }
        j++;
    }
    return i;
}
int vis[2107];
int prime[2107];
int gen_primes(int m)
{
    memset(vis,0,sizeof(vis));
    int cnt=0;
    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;
}

LL powmod(LL a,LL n)
{
    LL mod=1e9+7;
    LL res=1;
    while(n){
        if(n&1) res=res*a%mod;
        a=a*a%mod;
        n>>=1;
    }
    return res;
}
int main()
{
    int prime_n=gen_primes(2107);
    int T;
    scanf("%d",&T);
    for(int t=1;t<=T;t++)
    {
        memset(A,0,sizeof(A));
        int n;
        scanf("%d",&n);
        int maxp=0;
        for(int i=0;i<n;i++)
        {
            LL x;
            scanf("%lld",&x);
            for(int j=0;j<prime_n;j++)
            {
                while(x%prime[j]==0)
                {
                    maxp=max(maxp,j);
                    x/=prime[j];
                    A[j][i]^=1;
                }
            }
        }
        int r=ra_nk(maxp+1,n);
        printf("Case #%d:\n",t);
        printf("%lld\n",powmod(2,(LL)n-r)-1);
    }
}

转载的一个解释:

首先,我们知道的是,完全平方数的各种质因子必定出现偶数次

不然不可能被开方

例如36=2*2*3*3

质因子2,3均出现两次

所以呢,此题已经可以转化为类似开关问题的高斯消元了


这里,,表示第i个数取或不取

,表示质因子出现偶数次

,表示(第j个数分解质因数后,2000以内第i个质数出现多少次,奇数次值为1,偶数次值为2)

剩下的就是套一下高斯消元的模板,求解出自由变元的个数ans,那此题的结果就是,这个快速幂求解一下就可以了

如果还是不明白的话,我们来举例说明

就比如样例3,3,4

方程变元x前的系数k为我们打素数表2,3,5,……,1999中第k个质数出现奇数次还是偶数次

那该样例可得方程组为


第一条方程是质数2的贡献,因为3是不包含质因子2的,故贡献为0,而4虽包含质因子2,但出现了偶数次,故贡献同样为0

第二条方程,两个3都贡献了1,而4不包含质因子3,所以无贡献

显然,方程组只有一条方程,但有3个未知数,所以自由变元有2个,而自由变元的取值为{0,1}

故方程组的解有2^2=4种,除去全为0的一种(因为题目指明至少取一个数),剩3种(1,1,0),(0,0,1),(1,1,1)


#include<stdio.h>  
#include<string.h>  
#include<stdlib.h>  
#include<queue>  
#include<stack>  
#include<math.h>  
#include<vector>  
#include<map>  
#include<set>  
#include<cmath>  
#include<complex>  
#include<string>  
#include<algorithm>  
#include<iostream>  
#define eps 1e-9  
#define LL long long  
#define bitnum(a) __builtin_popcount(a)  
using namespace std;  
const int N = 305;  
const int M = 2001;  
const int inf = 1000000007;  
const int mod = 1000000007;  
int prime[M],k;  
bool v[M];  
//有equ个方程,var个变元。增广矩阵行数为equ,列数为var+1,分别为0到var  
int equ,var;  
int a[N][N]; //增广矩阵  
int x[N]; //解集  
int free_x[N];//用来存储自由变元(多解枚举自由变元可以使用)  
int free_num;//自由变元的个数  
void get_prime()  
{  
    k=0;  
    for(int i=2;i<M;i++)  
        if(!v[i])  
        {  
            prime[k++]=i;  
            for(int j=i;j<M;j+=i)  
                v[j]=true;  
        }  
}  
__int64 Quick_Mod(int a,int b)//快速幂  
{  
    __int64 res = 1,term = a % mod;  
    while(b)  
    {  
        if(b & 1) res = (res * term) % mod;  
        term = (term * term) % mod;  
        b >>= 1;  
    }  
    return res;  
}  
//返回值为-1表示无解,为0是唯一解,否则返回自由变元个数  
int Gauss()  
{  
    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 main()  
{  
    get_prime();  
    int t,i,j,n,p=1,c;  
    __int64 ans,s;  
    scanf("%d",&t);  
    while(t--)  
    {  
        ans=0;  
        memset(a,0,sizeof(a));  
        scanf("%d",&n);  
        equ=k;var=n;  
        for(i=0;i<n;i++)  
        {  
            scanf("%I64d",&s);  
            for(j=0;j<k;j++)  
            {  
                c=0;  
                while(s%prime[j]==0)  
                {  
                    s/=prime[j];  
                    c++;  
                }  
                if(c&1)  
                    a[j][i]=1;  
            }  
        }  
        int r,c;  
        ans=Gauss();  
        printf("Case #%d:\n%I64d\n",p++,Quick_Mod(2,ans)-1);  
    }  
    return 0;  
}  


k8s上分离集群seatunnel部署(生产推荐) 阅读详情

相关推荐

避坑指南:海康MV_CC_SetIntValue接口的7个典型报错解决方案

本文深度解析海康工业相机SDK中MV_CC_SetIntValue接口的典型报错,提供7个实战解决方案。针对MV_E_CALLORDER、MV_E_PARAMETER等高频错误码,从设备状态、参数值域、依赖关系等核心约束入手,给出清晰的诊断流程与根治代码,帮助开发者构建健壮的参数设置模块,提升开发效率。

y2z3a4b5c的博客 1078

HDU5833-Zhu and 772002(高斯消元)

Zhu and 772002                                                                        Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

wang_128的博客 428

5G(NR)物理层面试问答

1.什么是参数集(Numerologies)? 答:在5G中由于其频段很宽,设置了不同的子载波带宽,另根据频段、循环前缀、帧结构等组成了参数集。 2.5G中的循环前缀有几种? 答:5G网络支持5种子载波间隔,有两种循环前缀(正常和扩展)。其中:参数集2,即子载波间隔60kHz支持常规循环前缀和扩展循环前缀。 3.5G无线网络在下行(DL)和上行(UL)均使用OFDM波形? 答:5G网络下行链路(DL)和上行链路(UL)使用的波形及处理见下图: 4.5G物理层帧和子帧是多长时间? 答:5G.

starts1990的博客 2377

HDU 5833 Zhu and 772002

高斯消元。求有多少不同组解。 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #i...

weixin_34192732的博客 147

90nm CMOS工艺下6μW超低功耗LDO设计实战:从原理图到版图全解析

本文详细解析了在90nm CMOS工艺下设计一款静态功耗仅为6μW的超低功耗LDO(低压差线性稳压器)的全过程。文章深入探讨了如何通过改进型翻转电压跟随器(FVF)架构实现无输出电容设计,在满足极低功耗和芯片面积高效(chip-area-efficient)要求的同时,确保环路稳定性与快速瞬态响应,为物联网、可穿戴设备等应用提供关键电源管理解决方案。

weixin_29196613的博客 274

YOLOv10改进 | 主干篇 | 引入FasterNet:Run, Don‘t Walk,追求更快的神经网络

本文引入了 FasterNet 作为 YOLOv10 的主干网络。通过 PConv 算子,我们有效降低了模型的计算冗余。对于追求极致推理速度的场景(如树莓派、Jetson Nano),该改进方案极具价值。建议在训练时配合混合精度训练 (AMP)进一步加速。

weixin_51988935的博客 604

HDU---5833:Zhu and 772002【高斯消元】

题意: 给出N个数,问从中选出一些数,使得它们的乘积为完全平方数的选择方案数 分析: 若一个数为完全平方数,则它每个质因子的个数一定为偶数,对于第i个数要么选,要么不选,设为xi(0/1),则对于每个质因子: P1 : P1_a1*X1 + P1_a2*X2 + ...... + P1_an*Xn = 0 (mod 2) P2 :P2_a1*X1 + P2_a2*X2 + .........

KobeDuu 280

大模型之Spring AI实战系列(一):基础认知篇 - 开启智能应用开发之旅

Spring AI 是一个轻量级开源框架,旨在简化 AI 模型在企业级 Java 应用中的集成与管理。它提供了跨多个 AI 服务提供商的便携式 API,支持聊天、文本转图像、嵌入式模型等多种功能,并兼容主流的 AI 模型提供商如 OpenAI、Google 等。Spring AI 的核心功能包括结构化输出、向量数据库支持、工具/函数调用、可观察性、文档摄取 ETL 框架、AI 模型评估等。

寻道AI,探索AI无限可能! 6364

hdu5833 Zhu and 772002 (高斯消元的简单应用)

hdu5833 Zhu and 772002 (高斯消元的简单应用):http://acm.hdu.edu.cn/showproblem.php?pid=5833 题面描述: Zhu and 772002 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total

而濡木染 778

【Unity动画优化插件】BT - OptiAnimX —— AAA级动画优化框架深度剖析

BT - OptiAnimX 是一款面向 Unity 的高性能动画优化框架,核心目标是解决多角色动画场景中的性能瓶颈问题。该插件对标《战争机器5》和《巫师3》等 AAA 游戏中的动画优化技术,通过一整套自动化与智能化的优化策略,将动画性能提升与视觉质量控制结合在一起。它适用于从移动端、VR 到高端 PC 的多平台项目,尤其在“多人角色 + 高频动画”的场景中表现突出,例如 MMO、开放世界、动作游戏等。BT - OptiAnimX 本质上是一套“动画性能调度系统”,而不仅仅是优化工具。

2403_88403568的博客 433

优快云独家首发!万字长文,YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程!小白也能看懂!掌握了这个就掌握了魔改YOLO的核心!

🍀🍀🍀YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程,全网最强,学不会算我输!!!

Coding... 1万+

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

杭锦泉的博客 653

备战数学建模38-粒子群算法pso番外篇1(攻坚战2)

粒子群算法最初是根据鸟类群体行为得到的启发,对鸟群行为进行仿真的算法,是一种启发式算法,也就是智能优化算法,利用信息共享,通过中间信息进行改进搜索,从而获得问题的可行解。我们简单从下图去体会一下粒子群算法,就是有多个鸟,每个鸟相当于一个粒子,每只鸟的位置受自己认知的历史最佳位置和当前距离食物最近的鸟的位置的影响。我们进一步分析这个图,可以得到两个公式,第一个是速度公式,即每只鸟的当前速度受上一步的速度惯性,自我认知和社会认知三部分影响,第二个是位置公式,即每只鸟的位置受上一位置和上一位置的速度的影响。

nuist_NJUPT的博客 1664

HDU 5833 Zhu and 772002 高斯消元

题目链接 HDU 5833 Zhu and 772002 高斯消元 题解 完全平方数有因子的偶数次幂乘积构成 对于因数个数这就构成了%2意义下的方程组,对于因子列异或方程组 求自由元的自由组合方案数 因为不是很熟悉bitset加上hdu巨坑评测机,然后调了一下午?  代码 #include<bits/stdc++.h> using namespace std; // 每天好...

agtvo48266的专栏 203

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

1002-Zhu and 772002 题目大意:给出n个数字,问有多少种方式取(1~n)个数字使得成为一个完美平方数 题目思路: 求完全平方数,质因子的范围也知道,所以我们可以对每个质因子列出一个模意义下的方程(mod 2),然后求变元的个数就行了。 ans=2^num-1(去掉全部为0) 如何求变元的个数,就是在高斯消元的时候对于一个未知数xi,如果

Linoy 1370

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

[hdu 5833 Zhu and 772002] 高斯消元求异或方程组

[hdu 5833 Zhu and 772002] Zhu and 772002 高斯消元求异或方程组 题目链接:[hdu 5833 Zhu and 772002]  题意描述:给定N个数, N 解题思路:高斯消元捣鼓了一两天。总算有丝丝收获。 完全平方数的每个质因子都是出现偶数次。我们可以很容易的列出一个模二异或方程组。变元可以分别用1,0 表示每个数选或者不选。然后系数a[i][j]

Fighting! 741

HDU 5833 Zhu and 772002 (高斯消元)

Zhu and 772002 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5833 Description Zhu and 772002 are both good at math. One day, Zhu wants to test the ability of 772002, so he asks 772002 to solv...

dituonian8372的博客 145

Zhu and 772002 HDU - 5833 高斯消元

分解质因数 完全平方数 分析 https://www.jianshu.com/p/888f2c2b31bc 注意系数摆放顺序 素数 2 3 5 4: 2 0 0 6: 1 1 0 10: 1 0 1 15: 0 1 1 每个数对应的次数序列 依次列摆,得矩阵 2 1 1 0 0...

夷则九的博客 348

高斯消元/异或方程组-HDU 5833-Zhu and 772002

高斯消元/异或方程组-HDU 5833-Zhu and 772002 题目链接: Zhu and 772002 题目基础: 高斯消元法(含异或方程组求解) 思路: 题目大意: 给N个数,选出1~k个数相乘,问有多少种方式,使得相乘结果为完全平方数 题解: 完全平方数可由素数因子相乘而得,并且每种因子成对存在 题目给了一个重要提示,素数因子不会大于2000...

[SZU_Crayon] 469

Hdu 5833 Zhu and 772002 异或方程组高斯消元

Zhu and 772002 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2342    Accepted Submission(s): 850 Problem Description Zhu and 7720

J. Cole 518

hdu 5833 Zhu and 772002 (按位异或的高斯消元)

最近都在打校积分赛 肝背包 今天突然遇到了高斯消元 于是就 来一发吧 http://acm.hdu.edu.cn/showproblem.php?pid=5833 题目链接 大白书160的题跟这个完全一模一样啊 Problem Description Zhu and 772002 are both good at math. One day, Zhu wants to test the ...

szudianchuang的博客 231

hdu 5833 Zhu and 772002 高斯消元

Zhu and 772002 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1253    Accepted Submission(s): 444 Problem Description Zhu and 7720

swust_fang 655

[HDU 5833] Zhu and 772002 (高斯消元)

HDU - 5833 有 NN个数,每个数的所有质因子都不超过 2000 问选择其中若干个数使他们的乘积为平方数的方案数 其中 N≤300N\le 300 CCPC16网赛的题,据说是原题,学长直接把以前的代码贴上去就过了 显然题目可以转化为选择若干个数,使他们的每个质因子的次幂和为偶数 首先设 xix_i为是否选择第 ii个数,xix_i的取值为 0或 1 分解每个数,然后根

MisDeer's blog 376

Hdu-5833 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

WZJRJ28 548

【HDU 5833】【异或方程组高斯消元】Zhu and 772002

传送门:HDU 5833 Zhu and 772002 描述: Zhu and 772002 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1518    Accepted Submission(s): 540

魔笛手的博客 516

hdu5833 Zhu and 772002(高斯消元解异或方程组)

题意: 给定长度为n的序列a,保证每个元素的最大质因子不超过2000。 问有多少种非空下标集合,满足集合内所有下标所对应的数的乘积是完全平方数。 数据范围:n<=300,a(i)<=1e18

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 157
上一篇: (HDU)5832 - A water problem【大数取模】
下一篇: 维基百科搬运 树 (数据结构)
ACDoge
博客等级 码龄10年 8粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值