时间限制 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的更多相关文章

  1. THE BUG 队第一次团队作业

    1.队名: THE BUG 队 2.队员学号: 杨梓琦 3118005115(队长) 温海源,3118005109 陈杰才,3118005089 李华,3118005097 钟明康,311800512 ...

  2. THE BUG 队第一次团队项目作业

    队名: THE BUG 队 2.队员学号: 杨梓琦 3118005115(队长) 温海源,3118005109 陈杰才,3118005089 李华,3118005097 钟明康,3118005123 ...

随机推荐

  1. 并发和多线程(二)--线程安全、synchronized、CAS简介

    线程安全性: 当多个线程访问一个类的时候,这个类始终表示出正确的行为,那么这个类是线程安全的. 无状态的对象一定是线程安全的,例如大部分service.dao.Servlet都是无状态的. 线程安全体 ...

  2. CMU-准备

    TOEFL成绩90分以上,GPA大于3.0,GRE1250分以上(不做明确要求) 申请条件:GRE成绩,建议有专科成绩;托福250,雅思7.0;简历;3封推荐信 TOEFL(The Test of E ...

  3. Python字符的转义

    参考原文 廖雪峰Python教程 字符的转义 字符串是以单引号' 或双引号" 括起来的任意文本,比如'abc',"xyz".''或""本身只是一种表示 ...

  4. 题解 洛谷P3203/BZOJ2002【[HNOI2010]弹飞绵羊】

    裸的LCT,关键是要怎么连边,怎么将这种弹飞关系转化成连边就行了. 那么我们可以这样连边: 一个节点i的爸爸就是i+ki. 没有i+ki那么就被弹飞了,即\(i\)的爸爸是虚拟节点n+1. 那么怎么求 ...

  5. 数塔(hdoj 2084,动态规划递推)

    在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...

  6. enote笔记语言(2)(ver0.4)

    why not(whyn't)                    为什么不(与“why”相反对应,是它的反面)   how对策 how设计   key-memo:                 ...

  7. 洛谷——P1176 路径计数2

    P1176 路径计数2 题目描述 一个N \times NN×N的网格,你一开始在(1,1)(1,1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N,N)(N,N),即右下角有 ...

  8. 简述systemd的新特性及unit常见类型分析、使用systemd管理编译安装的nginx

    1. systemd新特性 并行处理(同时启动)所有服务. 基于依赖关系定义的服务控制逻辑 系统状态快照 按需激活进程,只有第一次被访问时才会真正启动: 2. systemd的常见unit类型 Ser ...

  9. 洛谷 1984 [SDOI2008]烧水问题

    [题解] 烧开每一杯水之后都用它去把其他没烧开的水焐热,这样显然是最优的.然后推推式子或者列表找规律就好了. #include<cstdio> #include<algorithm& ...

  10. 电商架构设计-通过系统和业务拆分,遵循单一职责原则SRP,保障整个系统的可用性和稳定性

    个人观察 1.通过系统和业务拆分,遵循单一职责原则SRP,保障整个系统的可用性和稳定性. 2.单一职责原则SRP,真的很关键,广大程序员需要不断深入理解这个原则. 3.架构图是架构师的重要输出,通过图 ...