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]);
}

#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]);
}

More from author

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Related posts

Advertismentspot_img

Latest posts

Stop Buying Cheap Alternatives This Yoga Mat Accessories Is the Real Deal

📢 As an Amazon Associate, I earn from qualifying purchases.I stumbled across this while desperately trying to fix a recurring problem in my routine....

I want to win Miss Universe Nigeria like my mum — Dr Danielle Adewusi

Medical doctor and beauty pageant contestant Dr. Danielle Adewusi is making headlines across the nation as she embarks on an inspiring quest to win...

The Real Truth About Led Strip Lights Room Decor Before You Buy

📢 As an Amazon Associate, I earn from qualifying purchases.If you had told me six months ago that a single purchase would change how...

Want to stay up to date with the latest news?

We would love to hear from you! Please fill in your details and we will stay in touch. It's that simple!