Advertisement

平方子集

阅读量:

题解:

题目要求找出若干个数的乘积构成一个完全平方数,而完全平方数在质因数分解后,每个质因子的指数均为偶数。在70以内的范围内,素数的数量仅有十余个,因此采用状态压缩动态规划的方法进行求解。状态压缩所表示的内容是各个素数因子的指数是否为偶数。当选择一个数值时,相当于将其质因数分解后的指数累加至对应的状态中。若当前质因子的指数为偶数,则加上偶数值不会改变其奇偶性,可以直接从上一状态转移而来;而当指数为奇数时,则需要转移到异或结果为0的状态。根据二项式定理可知,在k个元素中选取奇数个(如1、3、5等)的组合方式数目与选取偶数个的方式数目相同,均为2^{k-1}

复制代码
    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    const int mod=1e9+7;
    const int N=1e5+10;
    int f[2][(1<<20)+1],num[75],pow2[N];
    vector<int> prime;
    void init()
    {
    for(int i=2;i<=70;i++){
        int flag=0;
        for(int j=2;j<=sqrt(i);j++){

全部评论 (0)

还没有任何评论哟~