Cod sursa(job #752267)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 28 mai 2012 11:29:33
Problema Triplete Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#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;
}