样例没过求助
查看原帖
样例没过求助
275860
___A__楼主2024/4/28 12:31
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5,mod=998244353,V=1<<13;
int n,m,a[N],S[V],dp[V][V];
vector<int>vec;
map<int,int>num;
int ksm(int x,int n){
    int ret=1;
    while(n){
        if(n%2){
            ret=ret*x%mod;
        }
        x=x*x%mod,n/=2;
    }
    return ret;
}
signed main(){
    cin>>n>>m;
    int tmp=m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=2;i*i<=m;i++){
        if(m%i==0){
            num[i]=1;
            while(m%i==0){
                m/=i,num[i]*=i;
            }
            vec.push_back(i);
        }
    }
    if(m>1){
        vec.push_back(m),num[m]=m;
    }
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        if(tmp%a[i]==0){
            int now=0,tmp=0;
            for(int j:vec){
                if(a[i]%num[j]==0){
                    tmp+=(1<<now);
                }
                now++;
            }
            S[tmp]++;
            if(!tmp){
                dp[0][0]=dp[0][0]*2%mod;
            }
        }
    }//dp[i][j]只使用前i个状态 让并达到了j的方案数
    for(int i=1;i<V;i++){
        for(int j=0;j<V;j++){
            dp[i][j]=dp[i-1][j];
        }
        for(int j=0;j<V;j++){
            if(!S[i]){
                continue;
            }
            dp[i][i|j]=(dp[i][i|j]+dp[i-1][j]*ksm(2,S[i]-1))%mod;
        }
    }
    cout<<dp[V-1][(1<<vec.size())-1];
}
2024/4/28 12:31
加载中...