Codeforces 1485D - Multiples and Power Differences (构造)

Codeforces Round #701 (Div. 2) D. Multiples and Power Differences


题意

给定 n ∗ m n*m nm的矩阵 A A A,要求构造出一个 n ∗ m n*m nm的矩阵 B B B,满足

  • 1 ≤ b i , j ≤ 1 0 6 1\le b_{i,j}\le 10^6 1bi,j106

  • b i , j b_{i,j} bi,j a i , j a_{i,j} ai,j的倍数

  • 矩阵 B B B中每个元素与相邻任何元素的值之差的绝对值必须是某个正整数的四次方

限制

1 ≤ n , m ≤ 500 1\le n,m\le 500 1n,m500

1 ≤ a i , j ≤ 16 1\le a_{i,j}\le 16 1ai,j16




思路

注意到 1 ≤ a i , j ≤ 16 1\le a_{i,j}\le 16 1ai,j16,首先想到的是应当先求出一个数 d d d,且 1 1 1 16 16 16任一数字都是 d d d的因子

16 ! 16! 16!显然过大,所以 d = l c m { 1 , 2 , ⋯   , 16 } = 720720 < 1 0 6 d=lcm\{1,2,\cdots ,16\}=720720\lt 10^6 d=lcm{ 1,2,,16}=720720<106

然后可以假设 B B B矩阵所有元素都是 d d d,但题目要求的是相邻差值为某个正整数的四次方

所以可以错位令其加上 A A A矩阵中数的四次方,使得:

对于任意一个值为 d d d的位置,它与四周元素的差值为四周元素值的四次方

对于任意一个值不为 d d d的位置,它的四周元素值均为 d d d(差值即自身的四次方)


代码

#include
using namespace std;

const int d=2*2*2*2*3*3*5*7*11*13; //lcm(1~16)

int main()
{
     
    int n,m,a;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
     
            scanf("%d",&a);
            if((i+j)&1)
                printf("%d",d);
            else
                printf("%d",d+a*a*a*a);
            putchar(j==m?'\n':' ');
        }
    return 0;
}

To cnblogs

你可能感兴趣的:(Codeforces)