CF D.Mister B and Astronomers
题意概括好麻烦,
好吧既然是英文题面那放一下题意。
题意:有 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的更多相关文章
- 【CF819D】Mister B and Astronomers EXGCD
[CF819D]Mister B and Astronomers 题意:小鼠Jack想当太空人(哦不,太空鼠)!为此,它在夜晚带领一堆小朋友一起来到户外看星星.一共有 $n$ 只小鼠,这些小鼠围成一 ...
- codeforeces:Mister B and Astronomers分析和实现
题目很长,稍微翻译一下: 外星球每隔T秒中只有一秒可以被观测到,其它T-1秒无法被观测.n个天文学家(分别编号为1,...,n)轮流观测天空1秒,且第i+1个科学家在第i个天文学家后ai+1秒后才执行 ...
- 【不知道怎么分类】CF 819B Mister B and PR Shifts
题目内容 洛谷链接 定义一个全排列\(p_i\)的偏移值为\(\sum_{i=1}^{n}|p[i]-i|\). 给你一个全排列,你可以从后面拿\(k\in[0,n-1]\)个数放在前面,使得该全排列 ...
- 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 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...
- ARC下OC对象和CF对象之间的桥接(bridge)
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...
- [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
- 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 ...
随机推荐
- 最新的 cocoapods 安装与使用(2019.04)
cocoapods简介: cocoapods 是iOS的类库管理工具,可以让开发者很方便集成各种第三方库,而不用去网站上一个个下载,再一个个文件夹的拖进项目中,还得添加相关的系统依赖库.只需要安装好c ...
- 随机函数rand()与srand()
一.int rand(void); 函数所在的头文件是stdlib.h: 其内部实现线性同除法,不是真正的随机数.通常rand()%x是指在x范围内取模,返回值0-x; 系统默认随机种子是1: 二.v ...
- Python 随笔-1
python的发展史: python 2.7 July 3,2010 目前业内主流使用的工业版本 主讲3.0 32bit = 内存的最大寻址空间为2*32 4G的空间 6 ...
- Python随笔--魔法方法(析构与构造)
#析构方法的调用
- 高通sdm845_la2.0源码编译及使用QFIL刷机
一.下载源码 高通芯片代码下载地址:https://chipcode.qti.qualcomm.com/ . *_amss_standard_oem : 高通私有源码(*为sdm845-la--. * ...
- java算法02 - 树
树是一类重要的非线性结构.而二叉树是一种比较重要的树,接下来我们来了解二叉树的相关内容. 二叉搜索树:每个节点都不比它左子树的任意元素小,而且不比它的右子树的任意元素大. /** * 二叉搜索树 O( ...
- IIS10安装IIS URL重写模块2伪静态组件提示需要IIS7.0以上版本。
解决方法: 打开注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp 双击右边MajorVersion,默认的数值是a,修改成9,然后再安装 ,安装完成后 ...
- Datatables一些常见的JS用法(多与表格有关)
**********************--倒--序--上--升--(方便新增.更新)*********************** (3)给 动态生成 的 行 内按钮,添加点击事件(多用于分页情 ...
- 60行python代码分析2018互联网大事件
2018年是改革开放四十周年,也是互联网发展的重要一年.经历了区块链,人工智能潮的互联网行业逐渐迎来了冬天.这一年里有无数的事件发生着,正好学了python数据处理相关,那么就用python对18年的 ...
- 看到一个简单的背单词java程序的设计,收藏下
https://blog.csdn.net/qq_40605167/article/details/81023836