一个长度为n的序列a1, a2, an。希望从这个序列中删除吗某些数, 使得剩下的数的最大公约数恰好等于k,求解有多少种删除的方案。给出C++代码
时间: 2023-05-29 09:07:03 浏览: 159
同学录 有删除 有插入 有显示 等等 C++代码
```cpp
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=20;
int n,k;
int a[N];
LL f[1<<N][N];
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
if(a[i]%k==0) f[1<<i][i]=1;
for(int i=1;i<1<<n;i++)
for(int j=0;j<n;j++)
if(i>>j&1)
for(int k=0;k<n;k++)
if(!(i>>k&1))
if(gcd(a[j],a[k])%k==0) f[i|1<<k][k]+=f[i][j];
LL res=0;
for(int i=1;i<1<<n;i++)
{
int cnt=0;
for(int j=0;j<n;j++)
if(i>>j&1) cnt++;
if(cnt&1) res-=f[i][n-1];
else res+=f[i][n-1];
}
cout<<res<<endl;
return 0;
}
```
阅读全文