题意概括好麻烦,

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

题意:有 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. 记录一次配置golang服务器端口

    之前配置程序监听端口,地址都写成IP+:Port的格式,然而一直调试不同,也找不出问题. 后来,参考博客https://blog.csdn.net/yoie01/article/details/214 ...

  2. spark中map与flatMap的区别

    作为spark初学者对,一直对map与flatMap两个函数比较难以理解,这几天看了和写了不少例子,终于把它们搞清楚了 两者的区别主要在于action后得到的值 例子: import org.apac ...

  3. web前端的前景

    随着时代的发展,现在从事IT方向的人有很多,所以励志要成为前端开发工程师的人有很多.当然也有很多人在犹豫不知道该从事哪个方向,我今天就是来给大家分析一下Web前端开发的前景.包括工作内容,发展前景和薪 ...

  4. Oracle查询和过滤重复数据

    对数据库某些意外情况,引起的重复数据,如何处理呢? ----------------查重复: select * from satisfaction_survey s and s.project_no ...

  5. java基础知识—抽象和封装

    1.从现实中抽象出类的步骤: 1)找出它的种类--类名 2)找出它的属性--字段的名称 3)找出它的行为--方法名 2.抽象的原则:根据面向对象的思想抽象出类. 3.类图的好处:直观.容易理解. 4. ...

  6. 责任链模式(Chain of Responsibility)

    定义:为一个请求定义含有链状关系的接受对象,基于请求的类型,松耦合发送者和接受者之间的关系. 实现方式: 首先定义一个抽象类,包括一个公共抽象行为和决定子类链状关系的属性,然后创建一系列对象继承这个抽 ...

  7. 用indexof来统计字符出现的次数

    代码如下: <!DOCTYPE html> <html lang="en"> <head>     <meta charset=" ...

  8. 【译】REM vs EM - 世纪之争

    原文链接:https://zellwk.com/blog/rem-vs-em/ 在网络上排版的最佳做法之一是使用像rem和em这样的相对单位. 问题是,你应该使用哪个? 在rem支持者和em支持者之间 ...

  9. IDEAL 热更新

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  10. maven项目-修复Plugin execution not covered by lifecycle configuration: org.codehaus.mojo:build-helper-maven-plugin:1.8:add-resource (execution: add-resource, phase: generate-resources) pom.xml报错

    1:pom.xml代码 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build- ...