题意概括好麻烦,

好吧既然是英文题面那放一下题意。

题意:有 n 个观察员,第一个观察员在 0 秒开始观察星空,随后第i 个观察员会在第 i − 1 个观察员之后 ai 秒观察,第一个观察员也会在第 n 个观察员之后 a1 秒观察。有一颗星星在 [−T, −1] 之间某个整数秒前开始闪烁,之后每隔 T 秒闪烁一次。问每个观察员有多大概率可能成为第一个观察到这颗星星的人。答案乘以 T 输出。

数据范围:1 ≤ T ≤ 109, 2 ≤ n ≤ 2 × 105, 1 ≤ ai ≤ 109

老样子,我们放题目链接

做数学相关题的惯例是列一坨式子然后毫无思路。。。

题目要求第一个观察到,我们就先考虑怎样能观察到。令观察员i第一次观察的时刻为si,星星第一次出现的时刻为x,令S=∑ai , 绕完一圈后,(x+=S)%=T 。那么,i观察到星星仅当 si≡x(mod T)。我们将si对T取模,那么,仅当si=x时i能观察到星星。

考虑x的变化过程: (x+=S)%=T。令g=(S,T),则x->x`满足 g|(x-x`),即,x在变化过程中一定依次经过了和它同余的所有值,然后循坏(如 S=3,T=7,则有 0->3->6->2->5->1->4->0->...)。

因此,我们可以把对g同余的si单独拎出来当一组,这样就可看作S`(S/g)和T`(T/g)互质。对于每组,不同的si一定在环上有一个绝对的相对位置(以上述例子为例,s={4,1,3},那么相对位置为 3->1->4->3->...)。那么,相邻两个位置之间的长度差即为答案(以上述例子为例,si=4,答案为1->4的长度差1,si=1,答案为3->1的长度差4,si=3,答案为4->3的长度差2)。也就是说,只要求出他们的相对位置差,我们就得到了答案。(你问为什么间隔就是答案?可以想象一下每次选择这个x循环变化的环上一点往后跳,跳到有si=x的x就结束了)

我们不妨假定x初始值为0,x变化了k次(即走了k圈)成为了si(注意,所有si是对T取模的)。则有si=k*S`(mod T`)。于是我们就可以对于每个si用exgcd在O(log)时间内求出k。我们把同环内的k从小到大排个序,k[i]-k[i-1]就是拥有k[i]的观察员的答案。总时间复杂度O(nlog)。

//实际上,可以发现并不需要每次都用exgcd求k。我们可以求出S'*-xx=1(mod T')中的xx,每次xx*si就得到k了。因此nlogn的logn是排序带的,所以跑得还蛮快,没有IO优化也只要150ms,看了看大部分做法要300+ms 。

 #include <bits/stdc++.h>
using namespace std; #define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,r,l) for(int i=r;i>=l;--i) typedef long long ll; const int N=2e5+; ll S,T,g; void gcd(ll a,ll b,ll &x,ll &y){
if(b==){
g=a;
x=;
y=;
return ;
}
gcd(b,a%b,y,x);
y-=x*(a/b);
x%=T;y%=T;
} int n,s[N];
ll ans[N],xx,yy; struct Node{
int no;
ll r,val,k;//第k圈
}a[N]; bool cmp(Node aa,Node bb){
if(aa.r!=bb.r) return aa.r<bb.r;
if(aa.k!=bb.k) return aa.k<bb.k;
return aa.no<bb.no;
} int main(){
scanf("%lld%d",&T,&n);
rep(i,,n) scanf("%d",&s[i]); rep(i,,n) a[i].val=(a[i-].val+s[i])%T; S=(a[n].val+s[])%T;
gcd(S,T,xx,yy);
S/=g;T/=g;
xx*=-;xx=(xx%T+T)%T; rep(i,,n){
a[i].no=i;
a[i].r=a[i].val%g;
a[i].val/=g;
a[i].k=a[i].val*xx%T;
} sort(a+,a++n,cmp);
int L=;a[n+].r=-;
rep(i,,n)
if(a[i].r!=a[i+].r){
rep(j,L+,i) ans[a[j].no]=a[j].k-a[j-].k;
ans[a[L].no]=a[L].k-a[i].k+T; L=i+;
} rep(i,,n) printf("%lld ",ans[i]); return ;
}

CF D.Mister B and Astronomers的更多相关文章

  1. 【CF819D】Mister B and Astronomers EXGCD

    [CF819D]Mister B and Astronomers 题意:小鼠Jack想当太空人(哦不,太空鼠)!为此,它在夜晚带领一堆小朋友一起来到户外看星星.一共有 $n​$ 只小鼠,这些小鼠围成一 ...

  2. codeforeces:Mister B and Astronomers分析和实现

    题目很长,稍微翻译一下: 外星球每隔T秒中只有一秒可以被观测到,其它T-1秒无法被观测.n个天文学家(分别编号为1,...,n)轮流观测天空1秒,且第i+1个科学家在第i个天文学家后ai+1秒后才执行 ...

  3. 【不知道怎么分类】CF 819B Mister B and PR Shifts

    题目内容 洛谷链接 定义一个全排列\(p_i\)的偏移值为\(\sum_{i=1}^{n}|p[i]-i|\). 给你一个全排列,你可以从后面拿\(k\in[0,n-1]\)个数放在前面,使得该全排列 ...

  4. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  5. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  6. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  7. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  8. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  9. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

随机推荐

  1. Android Touch事件相关源码【Android SourceCode 2.3.6】

    2018-05-31 17:23:46 Note: 这里的源码来自Android 2.3.6,这个版本的代码比较简单,适合理解Touch事件的传递原理.后续版本源码复杂了很多,但是原理都是类似的. 2 ...

  2. 理解什么是适配器(adapter)和接口(interface)

    ● 适配器(adapter) In computing, adapter is a hardware device or software component that converts transm ...

  3. 关于dom&bom

    javascript 有三部分构成,ECMAScript,DOM和BOM,根据宿主(浏览器)的不同,具体的表现形式也不尽相同,ie和其他的浏览器风格迥异. 1. DOM 是 W3C的标准:[所有浏览器 ...

  4. CKEditor的使用,并实现图片上传

    ckeditor是一款富文本编辑器,类似于论坛帖子下边的回复输入框. 1.先要下载相应js文件,点我下载.根据自己的需求选择插件的丰富程度,下载后解压得到一个文件夹,放到webRoot目录下. 2.在 ...

  5. 零基础IDEA整合SpringBoot + Mybatis项目,及常见问题详细解答

    开发环境介绍:IDEA + maven + springboot2.1.4 1.用IDEA搭建SpringBoot项目:File - New - Project - Spring Initializr ...

  6. 用Spring Boot去创建web service

    1. 环境 JDK1.8 JavaSE1.8 web容器是 webSphere IDE是Eclipse 2. 创建一个空的 Maven Project 3. 打开pom.xml 配置相应的packag ...

  7. 【转】用opencv使摄像头在30fps下捕获1080p的数据

    原文:http://blog.sina.com.cn/s/blog_9b493e7b0102xvn6.html opencv可以捕获摄像头数据.如果要读高分辨率和高帧率,可以用如下的设置: captu ...

  8. centos 系统上如何把python升级为3

    第一种方式: SCL 源目前由 CentOS SIG 维护,除了重新编译构建 Red Hat 的 Software Collections 外,还额外提供一些它们自己的软件包. 该源中包含不少程序的更 ...

  9. sdn交换机和普通交换机区别

    SDN交换机基本具有普通交换机的所有功能.SDN交换机特别的功能在于支持OpenFlow协议(有些只支持OpenFlow1.0,有些强点支持1.0和1.3).不过你要连接交换机再手动将所需的端口改成支 ...

  10. Request.ServerVariables参数说明

    Request.ServerVariables["SERVER_NAME"] '获取服务器IP Request.ServerVariables["HTTP_REFERER ...