周子衡
2019-07-17 20:10:41
思路:数论+状态压缩
这道题的关键条件是:
当且仅当它的任意两个元素都互质时,这个序列bi才是和谐的。
也就是说,我们要让
很容易想到质数。一个简单的引理是:两个正整数互质,当且仅当它们没有共同的质因数。(证明从略)
因此转化为这
定理一:
证明:假设存在
同时我们还可以得到一个限定每个元素范围的定理:
定理二:
证明基本同上,从略。
计算得出
转移方程:
其中
另外本题要求输出方案,额外开一个数组
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int a[101]={};
int dp[101][(1<<16)]={},way[101][(1<<16)]={};
const int prm[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
int table[54]={};
void out(int now_x,int now_y)
{
if(!now_x)return;
out(now_x-1,now_y^table[way[now_x][now_y]]);
printf("%d ",way[now_x][now_y]);
}
int main()
{
int n=0;scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=58;i++)
{
for(int j=0;j<16;j++)
{
if(i%prm[j]==0)
{
table[i]^=(1<<j);
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<(1<<16);j++)
{
dp[i][j]=1e9;
for(int k=1;k<=58;k++)
{
if((table[k]|j)!=j)continue;
int tmp=abs(k-a[i])+dp[i-1][j^table[k]];
if(tmp<dp[i][j])dp[i][j]=tmp,way[i][j]=k;
}
}
}
out(n,(1<<16)-1);
}