# Codeforces Round #421 (Div. 1), problem: (D) Mister B and Astronomers Solution In C/C++

#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll n,t,k,i,m,q,f;
ll a[200100],s[200100],w[200100],p[200100],res[200100];
map <int,int> mapp;

ll cal(ll a,ll b,ll c) {
if (c==0) return 0;
if (a==0) return -1;
ll t=cal(b%a,a,(a-(c%a))%a);
if (t==-1) return -1;
else return (b*t+c)/a;
}

ll ucln(ll a,ll b) {
if (b==0) return a;
return ucln(b,a%b);
}

bool cmp(int x,int y) {
return (s[x]%k<s[y]%k) || (s[x]%k==s[y]%k && w[x]<w[y]);
}

int main() {
#ifndef ONLINE_JUDGE
freopen(“819D.inp”,”r”,stdin);
freopen(“819D.out”,”w”,stdout);
#endif // ONLINE_JUDGE

scanf(“%lld %lld”,&t,&n);

for (i=1;i<=n;i++) {
scanf(“%lld”,&a[i]);
if (i>1) s[i]=(s[i-1]+a[i])%t;
}
q=s[n]+a[1];
k=ucln(t,q);
for (i=1;i<=n;i++) {
if (mapp[s[i]]==1) continue;
mapp[s[i]]=1;
w[i]=cal(q,t,s[i]-(s[i]%k));
p[++m]=i;
}

sort(p+1,p+1+m,cmp);

f=1;
for (i=1;i<=m;i++) {
if (s[p[i]]%k!=s[p[i+1]]%k || i==m) {
res[p[i]]=t/k-w[p[i]]+w[p[f]];
f=i+1;
}
else res[p[i]]=w[p[i+1]]-w[p[i]];
}
for (i=1;i<=n;i++)
printf(“%d “,res[i]);
}

(Visited 29 times, 1 visits today)
By |2017-08-05T22:19:50+00:00August 5th, 2017|Categories: C/C++, Programming||0 Comments