[D. Multiples and Power Differences](https://codeforces.com/contest/1485/problem/D)
题意:
给定一个\(n*m\)的矩阵\(A\),要求构造出一个\(n*m\)的矩阵\(B\)。要求满足以下条件:
- \(1≤b_{i,j}≤10^6\);
- \(b_{i,j}\)是\(a_{i,j}\)的倍数;
- 矩阵\(B\)中每个元素与相邻任何元素的值之差的绝对值必须是某个正整数的四次方;
\(1≤n,m≤500\)
\(1\le a_{i,j}\le 16\)
思路:
考虑条件\(1\)和\(2\)。求出\(lcm(1,2,..,15,16)=720720\),令\(B\)矩阵中所有元素都为\(lcm\),则可以满足。
考虑条件\(3\)。需要将矩阵想象成国际象棋棋盘似的(本质上是个二分图),一部分黑,一部分白。
黑块的四周都是白块,白块的四周都是黑块。
所以在黑块上填上\(lcm\),在白块上填上\(lcm+(a_{i,j})^4\),反过来也无所谓。
最后检查一下\(lcm+(a_{i,j})^4 \leq 786256\),满足条件\(1\)和\(2\)。
Code:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <cassert>
#include<bits/stdc++.h>
#define debug(x) cout<<#x<<" :"<<x<<endl
using namespace std;
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define eps 1e-6
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=1e4+7;
ll powmod(ll a,ll b,ll mod1) {ll res=1;a%=mod1; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod1;a=a*a%mod1;}return res;}
const int maxn=2e5+10;
const int MAXN=2e5+10;
ll q[maxn];
ll n,m;
ll qpow(ll a,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*a;
a=a*a;
b>>=1;
}
return ans;
}
/*
构造
*/
ll a[501][501];
ll cnt[maxn];
int main(){
int t;
srand(time(NULL));
//scanf("%d",&t);
t=1;
while(t--){
cin>>n>>m;
rep(i,1,n)
rep(j,1,m){
cin>>a[i][j];
}
ll jc=1;
ll lcm=2;
rep(i,3,16)lcm=(lcm*i)/__gcd(lcm,i*1ll);
rep(i,1,n){
rep(j,1,m){
if((i+j)&1){
printf("%lld ",lcm+qpow(a[i][j],4));
}
else printf("%lld ",lcm);
}
puts("");
}
}
return 0;
}