题意概括好麻烦,

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

题意:有 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. cocos2d-html5 碰撞检测的几种方法

    游戏中的碰撞还是比较多的,比如角色与角色的碰撞,角色与墙壁的碰撞,角色与怪物的碰撞等,都需要进行碰撞的检测,来触发一定的事件 最近在尝试制作一个小游戏的时候需要用到碰撞检测,然后就查了下资料,并在论坛 ...

  2. 关于基于LinphoneSDK通话项目开发中遇到的相关问题

    在之前小学期的项目开发当中,我们小组进行的是使用网上开源的LinphoneSDK来开发一款Android端的VOIP电话APP. 因为网上关于这个SDK在安卓端的开发文档相当少,所以我们只能根据少量的 ...

  3. phpstrom mac 快捷键

    对应键 ⌘——Command ⌃ ——Control ⌥——Option/Alt ⇧——Shift ⇪——Caps Lock fn——功能键就是fn 编辑 Command+alt+T 用 (if..e ...

  4. ORACLE视图简单创建和使用

    1.创建 create view v (pdate,goodsId,productionId,qty)列名 as select p.pdate,p.goodsId,p.productionId,sum ...

  5. JS的作用域链与原型链

    来一波,好记性不如烂笔头. 这两条链子可是很重要的. 作用域链 当执行一段JS代码(全局代码或函数)时,JS引擎会创建为其创建一个作用域又称为执行上下文(Execution Context),在页面加 ...

  6. APP测试报告

    招标手机APP测试总结报告     作    者: 日    期: 2016-03-10 文档编号: 002 版    本: Ver 1.0 目   录 1.测试概述 1 1.1. 编写目的 1 1. ...

  7. java富文本编辑器KindEditor

    在页面写一个编辑框: <textarea name="content" class="form-control" id="content&quo ...

  8. 关于nginx安装的收藏

    http://blog.csdn.net/yuan_xw/article/details/51181282

  9. 计算1~100之间,能被3整除但是不能被7整除的数的和(C语言)

    #include<stdio.h> int main(agrc *agrv) { int n,i; int sum=0; scanf("%d",&n); for ...

  10. 低成本制作基于OpenWRT的渗透工具

    不知道你听说过Hak5的产品没有,它们可是黑客以及渗透测试人员的最爱.其中,有很多的PoC黑客工具都曾在热门美剧<黑客军团>中出现过.Hak5的 PACKETSQUIRREL 上架已经有好 ...