allonsy
时间限制 1s 空间限制 512MB
2.1 题目描述
“Allons-y!”
时间还算足够,好好看看题吧。
有一种说法,时间线是扭曲的,会相互交织。(一般在科幻片里比较流行?)
不管啦,反正现在有个蓝盒子,在时间线上随机游走。
记这个盒子一开始在时间线上的位置为 0,记当前位置为 pos,每一次穿梭,它
有 q 的概率到达 pos + 1,1 − q 的概率到达 pos − 1。
特别的,q 是一个有理数。
我们认为时间线的两端近乎在无穷远处,问 n 次穿梭后,蓝盒子离初始位置的
期望距离。
为了避免精度问题,这里采用取模来避免实数运算。
具体来说,输入会给出一个素数 p,而每次穿梭过程中从 pos 到达 pos + 1 的概
率 q 将在模意义下给出。(例如 q = ab ,这里保证 b, p 互素,读入的将是模意义下
。
的 ab )
2.2 输入格式
一行三个正整数 n, q, p,分别表示穿梭的次数、模 p 意义下的概率 q 和模数 p。
2.3 输出格式
一行一个整数,为蓝盒子离初始位置的期望距离在模意义下的值。
2.4 样例输入
100 1 1000000207
2.5 样例输出
100
42.6 数据规模和约定
对于全部的数据,10 9 ≤ p ≤ 2 × 10 9 且 p 为素数,0 ≤ q ≤ p − 1
对于 20% 的数据,n ≤ 15。
对于另外 30% 的数据,n ≤ 1000。
对于剩下 50% 的数据,n ≤ 5 × 10 4 。
【题解】
这道题我考试时连题目都没看懂。。。
然而考完后发现此题不难。。。
*先科普一下费马小定理:
特别的,当p为素数时,x无法被p整除,φ(p)=p-1,于是便有费马小定理Xp-1≡1(mod p)
在p是素数时,对任意正整数x都有Xp≡X(mod p)
于是对于a的逆元x,有ax≡1(mod m),对于a,m互素且m为素数时,有x=am-2,于是我们可以通过快速幂快速求出a的逆元。
另外,借助素数筛,我们还可以很快的求出1-n的欧拉函数值。每当我们找到一个素数,就把他的倍数的欧拉函数值乘上(p-1)/p.
而且,借助费马小定理我们可以实现对除法取模。*
这道题的模意义下,指的是把除法变成乘法,把a/b变成a*(1/b),而1/b是b的逆元。
这道题就变成数学问题了。
公式为f[n]=∑(n i=0)q^i*(1-q)^(n-i)C(n,i)|n−2×i|
然而我似乎不太理解这个公式,有时间再看吧。。(逃~~)
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll (long long)
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int Maxn=50005;
int n,q,p;
int fac[Maxn],ifac[Maxn],pw[Maxn];//fac阶乘 ifac阶乘逆元
il int gi()
{
re int x=0;
re short int t=1;
re char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
int qp(int a,int x)
{
int ret=1;
for (;x;x>>=1,a=ll(a)*a%p)
if (x&1) ret=ll(ret)*a%p;
return ret;
}
int c(int n,int k)
{
return ll(fac[n])*ifac[k]%p*ifac[n-k]%p;
}
int main()
{
//freopen("allonsy.in", "r", stdin);
// freopen("allonsy.out", "w", stdout);
n=gi();q=gi();p=gi();
fac[0]=1;
fp(i,1,n)
fac[i]=ll(fac[i-1])*i%p;//预处理i的阶乘
ifac[n]=qp(fac[n],p-2);//ifac[i]=fac[i]的负一次方 在模P意义下同等于fac[N]的P-2次方 此即费马小定理
fq(i,n-1,0)
ifac[i]=ifac[i+1]*ll(i+1)%p;//预处理i的阶乘逆元
fp(i,0,n) pw[i]=1;
int q0=1,q1=1;
fp(i,1,n)
{
q0=q0*ll(q)%p;
q1=q1*ll(1+p-q)%p;
pw[i]=ll(pw[i])*q0%p;
pw[n-i]=ll(pw[n-i])*q1%p;
}
int ans=0;
fp(i,0,n)
ans=(ans+ll(c(n,i))*pw[i]%p*abs(2*i-n))%p;
//abs(2*i-n)为离原点距离
//c用于求组合数
printf("%d\n",ans);
return 0;
}
allonsy的更多相关文章
- THE BUG 队第一次团队作业
1.队名: THE BUG 队 2.队员学号: 杨梓琦 3118005115(队长) 温海源,3118005109 陈杰才,3118005089 李华,3118005097 钟明康,311800512 ...
- THE BUG 队第一次团队项目作业
队名: THE BUG 队 2.队员学号: 杨梓琦 3118005115(队长) 温海源,3118005109 陈杰才,3118005089 李华,3118005097 钟明康,3118005123 ...
随机推荐
- ThinkPHP---TP功能类之公文管理功能2----------继续完善
[前言] 之前已经完成了公文的添加和列表展示功能,今天继续完善.做下公文的编辑和删除功能. [主体] (1)分析 控制器:DocController.class.php 方法:edit(将模板展示和数 ...
- 搭建Cookie池
很多时候我们在对网站进行数据抓取的时候,可以抓取一部分页面或者接口,这部分可能没有设置登录限制.但是如果要抓取大规模数据的时候,没有登录进行爬取会出现一些弊端.对于一些设置登录限制的页面,无法爬取对于 ...
- Object.prototype 原型和原型链
Object.prototype 原型和原型链 原型 Javascript中所有的对象都是Object的实例,并继承Object.prototype的属性和方法,有些属性是隐藏的.换句话说,在对象创建 ...
- 搜索--P1605 迷宫
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- Scrapy用Cookie实现模拟登录
模拟登录是爬取某些站点内容的一个关键,有些网站(特别是论坛类),不登录的话,一个数据也拿不到. 模拟登录有这样几个关键: 弄清楚登录的url一些网站打开出现登录的页面,地址栏大多数不是登录提交表单的u ...
- np.tile(), np.repeat() 和 tf.tile()
以上三个函数,主要区别在于能够拓展维度上和重复方式: np.tile() 能够拓展维度,并且整体重复: a = np.array([0,1,2]) np.tile(a,(2,2)) # out # a ...
- BZOJ 3648 寝室管理
[题解] GDOI2016 Day2T3 如果给出的数据是一棵树那么皆大欢喜直接点分治就好了,用树状数组维护大于x的数的个数.如果是一棵基环树,我们先断掉环上的一条边,然后跑点分治:再加上经过这条边的 ...
- Uva10305 Ordering Tasks
John有n个任务,但是有些任务需要在做完另外一些任务后才能做. 输入 输入有多组数据,每组数据第一行有两个整数1 <= n <= 100 和 m.n是任务个数(标记为1到n),m两个任务 ...
- Java 学习(6):java Number & Math & String & 数组...常用类型
目录 --- Number & Math类 --- Character 类 --- String 类 --- StringBuffer 类 --- 数组 Number & Math类: ...
- HXY烧情侣(洛谷 2194)
题目描述 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里有n座电影院,n对情侣分别在每座电影院里,然后电影院里都有汽油,但是要 ...