Pagini recente » Cod sursa (job #362407) | Cod sursa (job #1968732) | Cod sursa (job #2172995) | Cod sursa (job #2812210) | Cod sursa (job #752267)
Cod sursa(job #752267)
#include<stdio.h>
#include<assert.h>
#include<vector>
#include<algorithm>
using namespace std;
const int knmax = 50005;
int nums, mod, given[knmax], vis[knmax], dif[knmax], ans[knmax], mins[knmax];
void read(){
assert(freopen("criptare.in", "r", stdin));
scanf("%d%d", &nums, &mod);
for(int i = 0; i < nums; ++i)
scanf("%d", &given[i]);
}
void init(){
for(int i = 0; i < nums; ++i)
vis[i] = 0;
}
int gcd(int x, int y){
int z;
while(y){
z = x;
x = y;
y = z % y;
}
return x;
}
void solve(){
for(int i = 0; i < nums; ++i)
if(vis[i])
break;
else{
int t = i;
while(!vis[t]){
dif[(t + mod) % nums] = given[(t + 1) % nums] - given[t] + dif[t];
vis[t] = 1;
t = (t + mod) % nums;
}
}
init();
for(int i = 0; i < nums; ++i)
if(vis[i])
break;
else{
int t = i;
while(!vis[t]){
mins[i] = max(mins[i], -dif[t]);
vis[t] = 1;
t = (t + mod) % nums;
}
}
init();
for(int i = 0; i < nums; ++i)
if(vis[i])
break;
else{
int t = i;
while(!vis[t]){
ans[t] = mins[i] + dif[t];
vis[t] = 1;
t = (t + mod) % nums;
}
}
int sum = 0;
for(int i = 0; i < mod; ++i)
sum = sum + ans[i % nums];
sum = (given[0] - sum) / (mod / gcd(nums, mod));
init();
int t = 0;
while(!vis[t]){
ans[t] += sum;
vis[t] = 1;
t = (t + mod) % nums;
}
}
void write(){
assert(freopen("criptare.out", "w", stdout));
for(int i = 0; i < nums; ++i)
printf("%d ", ans[i]);
}
int main(){
read();
solve();
write();
return 0;
}