【CF819D】Mister B and Astronomers

题意:小鼠Jack想当太空人(哦不,太空鼠)!为此,它在夜晚带领一堆小朋友一起来到户外看星星。一共有 $n​$ 只小鼠,这些小鼠围成一圈轮流观察夜空。具体地,第 $i​$ 只小鼠会在第 $(i-1)\%n​$ 只小鼠观察夜空之后的第 $a_i​$ 秒,抬头观察 $1​$ 秒钟的夜空。即: $1​$ 号小鼠在第 $0​$ 秒观察夜空,$2​$ 号小鼠在第 $a_2​$ 秒观察夜空,$3​$ 号小鼠在第 $a_2+a_3​$ 秒观察夜空 ... $1​$ 号小鼠在第 $a_2+a_3+...+a_n+a_1​$ 秒观察夜空。今晚小鼠们特别想观察到的是名为 $X​$ 的星星,但是他们并不知道 $X​$ 会在什么时候闪烁,只知道 $X​$ 会每隔 $T​$ 秒闪烁一次,每次闪烁一秒钟,且第一次闪烁的时间在 $0​$ 到 $T-1​$ 之间。如果一个小鼠在观察夜空时,$X​$ 恰好在闪烁,则这个小鼠就会在这一秒发现 $X​$ 闪烁。我们定义第 $i​$ 只小鼠的幸运值为:有多少 $t\in [0,T),t\in Z​$ ,满足 如果 $X​$ 第一次闪烁的时间是第 $t​$ 秒,那么 $i​$ 将会是第一个发现 $X​$ 闪烁的小鼠。现在Jack想知道每个小鼠的幸运值是多少。

题解:设$S=\sum a_i$,那么假如第i只小鼠在第k*S+x秒钟观察到了星星,而这个时刻的星星已经被观察过了,就是说明存在一只小鼠在第k'*S+y秒钟观察到了星星,其中k'<k或k'=k且y<x,对于后一种情况我们特判掉。对于前一种情况,我们得到同余式(k-k')S=y-x(mod T),我们想知道的是k-k'的最小值。

现在我们只需要解这个同余式即可,先将S和T都除以gcd(S,T),同时将所有x按%gcd分组,显然只有同一组内的才会产生贡献。然后我们用exgcd解出k*S=-x(mod T)的k,在set里找一下k的前驱就能得到最小的k-k'了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <set>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=200010;
typedef long long ll;
int n,m;
ll S,T,d;
int ban[maxn],p[maxn];
ll t[maxn],k[maxn],top[maxn],ans[maxn];
vector<int> v[maxn];
vector<int>::iterator vi;
set<ll> s;
set<ll>::iterator si;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1,y=0;
return a;
}
ll ret=exgcd(b,a%b,x,y),t=x;
x=y,y=t-a/b*x;
return ret;
}
ll gcd(ll a,ll b)
{
return !b?a:gcd(b,a%b);
}
inline bool cmp(const int &a,const int &b)
{
return (t[a]%d==t[b]%d)?(a<b):(t[a]%d<t[b]%d);
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
T=rd(),n=rd();
int i;
S=rd();
for(i=2;i<=n;i++) t[i]=rd(),S+=t[i],t[i]+=t[i-1];
ll x,y,b;
d=exgcd(S,T,x,y);
b=T/d,x=(x%b+b)%b;
for(i=1;i<=n;i++)
{
if(s.find(t[i]%T)!=s.end()) ban[i]=1;
else s.insert(t[i]%T),p[++p[0]]=i;
}
if(S%T==0)
{
for(i=1;i<=n;i++) printf("%d ",1-ban[i]);
return 0;
}
sort(p+1,p+p[0]+1,cmp);
for(i=1;i<=p[0];i++)
{
if(i==1||t[p[i]]%d!=t[p[i-1]]%d) m++;
v[m].push_back(p[i]);
}
for(i=1;i<=m;i++)
{
s.clear();
for(vi=v[i].begin();vi!=v[i].end();vi++)
{
k[*vi]=x*(t[*vi]/d%b)%b;
if(s.find(k[*vi])!=s.end()) ban[*vi]=1;
else s.insert(k[*vi]);
}
for(vi=v[i].begin();vi!=v[i].end();vi++)
{
si=s.upper_bound(k[*vi]);
if(si==s.end()) si=s.begin(),ans[*vi]=(*si)+b-k[*vi];
else ans[*vi]=(*si)-k[*vi];
}
}
for(i=1;i<=n;i++) printf("%lld ",ans[i]);
return 0;
}

【CF819D】Mister B and Astronomers EXGCD的更多相关文章

  1. 【CF819C】Mister B and Beacons on Field 数学

    [CF819C]Mister B and Beacons on Field 题意:外星人盯上了Farmer Jack的农场!我们假设FJ的农场是一个二维直角坐标系,FJ的家在原点.外星人向FJ的农场上 ...

  2. 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判

    [BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b, ...

  3. 【BZOJ 1319】 Sgu261Discrete Rootsv (原根+BSGS+EXGCD)

    1319: Sgu261Discrete Roots Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 389  Solved: 172 Descriptio ...

  4. 【BZOJ5418】【NOI2018】屠龙勇士(数论,exgcd)

    [NOI2018]屠龙勇士(数论,exgcd) 题面 洛谷 题解 考场上半个小时就会做了,一个小时就写完了.. 然后发现没过样例,结果大力调发现中间值爆\(longlong\)了,然后就没管了.. 然 ...

  5. 【bzoj2242】[SDOI2011]计算器 EXgcd+BSGS

    题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p, ...

  6. 【Codeforces Round #421 (Div. 2) B】Mister B and Angle in Polygon

    [题目链接]:http://codeforces.com/contest/820/problem/B [题意] 给你一个正n边形; 然后让你在这正n边行中选3个点,组成一个角; 找出角的大小和所给的角 ...

  7. 【Codeforces Round #421 (Div. 2) A】Mister B and Book Reading

    [题目链接]:http://codeforces.com/contest/820/problem/A [题意] 每天看书能看v页; 且这个v每天能增加a; 但是v有上限v1; 然后每天还必须往回看t页 ...

  8. 【bzoj1004】[HNOI2008]Cards

    1004: [HNOI2008]Cards Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2928  Solved: 1754[Submit][Sta ...

  9. 【BZOJ3456】【CDQ分治+FNT】城市规划

    试题来源 2013中国国家集训队第二次作业 问题描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了. 刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得 ...

随机推荐

  1. 【WP8】ResourceDictionary

    WP8中引用资源字典 当我们定义的样式太多的时候,我们可以把样式分别定义在不同的文件中,然后通过 MergedDictionaries 应用到其他资源字典中,看下面Demo 我们可以把样式定义在多个文 ...

  2. Java高级面试题及答案

    List和Set比较,各自的子类比较 对比一:Arraylist与LinkedList的比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高 ...

  3. abbyy在使用时提示更改分辨率如何处理

    ABBYY FineReader 12识别质量取决于文档图像的分辨率.低图像分辨率(低于 150 dp)可能会降低识别质量,而过高的分辨率(高于 600 dpi)也不会明显提升图像质量,还会延长处理时 ...

  4. Android开发学习笔记-自定义控件的属性

    若想让自定义控件变得更加方便灵活,则就需要对控件进行定义属性,使其用起来更方便. 下面是自定义控件属性的方法 1.添加attrs.xml,内容格式样式可以参考sdk\platforms\android ...

  5. Ubuntu18.10下安装Qt5.12过程记录

    首先你得先安装Ubuntu操作系统(我是在VMWare14中安装的Ubuntu18.10版本). 阿里镜像:https://opsx.alibaba.com/mirror 我这里下载的文件为:ubun ...

  6. LINE@生活圈招募好友秘笈

    什么是「获得更多好友」页面? 您可从  LINE@ app >管理>获得更多好友  进入此页面. ▼ 「获得更多好友」新介面中,募集好友的四大秘诀 秘诀一.「以社群网站或电子邮件分享」 • ...

  7. html 内联函数宽度设置

    width and/or height in tables are not standard anymore; as Ianzz says, they are depreciated. Instead ...

  8. ios7注意事项随笔

    1,修改状态栏的样式和隐藏. 首先,需要在Info.plist配置文件中,增加键:UIViewControllerBasedStatusBarAppearance,并设置为YES: 然后,在UIVie ...

  9. my-small.ini、my-medium.ini、my-large.ini、my-huge.ini文件的作用

    安装完mysql之后或者是下载的免安装版解压之后,默认是没有my.ini文件的.但是,有几个类似的文件,如my-small.ini.my-medium.ini.my-large.ini.my-huge ...

  10. Python对象(下)

    前面一篇文章介绍了一些Python对象的基本概念,这篇接着来看看Python对象相关的一些内容. Python对象的比较 Python对象有三个要素:身份,类型和值,所以我们就分别从这三个角度出发看看 ...