你的名字叫czy是吧

(mynameisczy.pas/.c/.cpp)

尽管czy放了那么多只NTR酋长,也没能拦住黄巨大。黄巨大和czy相遇了……

“你的名字叫czy是吧”

“……”

“我们来单挑吧”

“……”

Hzw和czy决定用投骰子单挑。这骰子有6面,分别是1、1、1、2、2、2。如果投中1就是黄巨大赢一局,如果投中2就是czy赢一局。如果比对方多赢两局就获胜了。很公平吧?但是猥琐的czy捏碎了一张魔法卷轴,使得他可以把骰子投到2的概率改为p/q的形式(p,q为整数),但是他也不能确定这魔法卷轴改完概率是对他有益还是对黄巨大有益。所以他想知道在Q轮过后刚好比赛结束的概率是多少。但他知道最后的精确答案即既约分数a/b中a、b肯定很大,所以他只要知道a%k和b%k的数的大小就可以了,但是是精确的a%k和b%k。但是为了不让黄巨大瞄到他在干什么,czy要对数据进行加密……具体来说,第i个询问Qi的真正大小将是给定的Q减去上一个询问的a%k值,至于b%k就不管了。。。

输入

第一行四个数p,q,T,k,表示初始概率是p/q,以下T组询问,答案对k取模

接下来T行,每行一个数 Q,表示czy想知道比赛刚好在第Q轮停止的概率(已加密)

输出

T行,每行两个整数,表示要求的概率a/b中a%k和b%k的精确值。如果这个概率是0或1,直接输出0 0或1 1(中间有空格)。

样例输入1:

2 3 2 100

1

2

样例输出1:

0 0

5 9

样例输入2:

2 3 2 20

4

6

样例输出2:

0 1

0 9

数据范围:

对于30%数据,p,q<=5,T<=1000,k<=127,对于任意解密后的Q,有Q<=30

对于60%数据,p,q<=20,T<=100000,k<=65535,对于任意解密后的Q,有Q<=1000

对于100%数据,p,q<=100,T<=1000000, k<=2147483647,对于任意解密后的Q,有Q<=1000000

对于100%数据,有q>p,即0<= p/q<=1,但是不保证给定的p/q就是既约分数

zhb原创出品,改编自高一暑假数学作业必修三那章最后一题

这是这套题唯一会比较防ak的题了

首先题目我写了一大堆,就是要把你搞晕的

题意是有两个人进行游戏,其中第一个人在每局中获胜的概率是p/q,如果有一个人比另一个人多赢两局,则游戏结束。现在给出T个询问,每个询问Q表示求游戏刚好在第Q轮结束的精确概率a/b的a%k和b%k。要求a/b是这个概率的最简分数。

解法是这样的:

我们把每两局压成一轮,只有三种可能:第一个人赢了,第二个人赢了,两人各赢一局。这样如果有人赢了游戏结束,平局时两人分数相同,相当于又开始一局

这样我们注意到一个显然的事实:游戏不可能在奇数局结束。因为由上面的推论+自己yy可知,要结束一定是在一轮以后,就是偶数局之后。这样不合法情况删掉一半了

第一个人一轮赢必须连赢两局,就是(p/q)^2,即p^2/q^2

第二个人一轮赢也是连赢两局,就是(1-p/q)^2,通分完(p-q)^2/q^2

那么一局能结束的概率就是上面两个加起来,即[p^2+(p-q)^2]/q^2

一局不能结束的概率就是1-"上面那式子"

为简化条件,我们令一轮能结束的概率是A/B,一轮不能结束的概率是C/D。计算方法见上

那么对于有意义的询问,即偶数Q,令t=Q/2

那么比赛在第t轮即第Q局结束的充要条件是:在1到t-1轮两人都是平局,并且在第t轮比赛刚好结束

那么对于询问Q,[(C/D)^(t-1)] * (A/B) 即是所求

到这里应该都还能理解吧

然后比较难搞的是取模。因为p、q是100级别,那么p^2、q^2是1w级别,就是说ABCD这些数都是10000级别

要求的分数分子是C^(t-1)*A,分母是D^(t-1)*B,还要进行约分完取模。我们可以直接预处理使得A和B、C和D分别互质,但是我们没法保证A和D、B和C分别互质。这样约分就有困难了。比如A分解质因数有2^十几次方吧,D只有2^1,那么在接下来的十几次操作中都要用D的2去约掉A的2。但是ABCD的数据规模还算小,所以我们暴力搞出前20轮的答案,然后这样一来改约的也就约干净了,然后每次分子只乘C分母只乘D,又没有约分,可以直接递推。

#include<cstdio>
#define MX 10000 //ABCD的规模是10000
#define primeMX 1230 //10000以内1229个质数
#define LL long long
int prime[primeMX];
struct fenjie{
int rep[primeMX];
}aa,bb,cc,dd;
int p,q,T,k,a,b,c,d;
int ss[primeMX]; //用于暴力,分解质因数之后直接加/减在上面,如果是正的表示分子的分解质因数有ss[i]个prime[i],反之分母亦然
LL Q,last;
LL ansa[1000010],ansb[1000010]; //保存第i局结束的概率的分子分母
inline void shai() //筛法
{
bool mrk[10010]={0};
int leng=0;
for (int i=2;i<=MX;i++)
if (!mrk[i])
{
for (int j=2*i;j<=MX;j+=i)mrk[j]=1;
prime[++leng]=i;
}
}
inline int gcd(int a,int b) //gcd用于A和B、C和D先约分
{if (!b)return a;else return gcd(b,a%b);}
inline void divide(fenjie &a,int b) //分解质因数,用于前20轮暴力用
{
for (int i=1;i<primeMX;i++)
{
if (b==1)break;
while (b%prime[i]==0){b/=prime[i];a.rep[i]++;}
}
}
inline LL read() //快速读入,100w的询问不加肯定TLE
{
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
freopen("mynameisczy.in","r",stdin);
freopen("mynameisczy.out","w",stdout);
shai();
p=read();q=read();T=read();k=read();
if (p==1&&q==1||p==0&&q==0)ansa[2]=ansb[2]=1; //如果必胜或必败,那一定在第2局就结束。其余概率都是0
else
{
c=p*p+(q-p)*(q-p);
b=q*q;
a=b-c;
d=b; //这里我AB和CD的意义反过来了
int div1=gcd(a,b);a/=div1;b/=div1;
int div2=gcd(c,d);c/=div2;d/=div2;
divide(aa,a);
divide(bb,b);
divide(cc,c);
divide(dd,d);
ansa[2]=c%k;ansb[2]=d%k;
for (int i=1;i<primeMX;i++)
ss[i]+=cc.rep[i]-dd.rep[i];
for(int i=4;i<=40;i+=2)
{
long long sum1=1,sum2=1;
for (int j=1;j<primeMX;j++)
ss[j]+=aa.rep[j]-bb.rep[j];
for (int j=1;j<primeMX;j++)
if (ss[j]>0) for (int l=1;l<=ss[j];l++)sum1=(sum1*prime[j])%k;
else if (ss[j]<0)for (int l=1;l<=-ss[j];l++)sum2=(sum2*prime[j])%k;
ansa[i]=sum1;ansb[i]=sum2;
}
for (int i=42;i<=1000000;i+=2)
{
ansa[i]=(ansa[i-2]*a)%k;
ansb[i]=(ansb[i-2]*b)%k;
}
}
for(int i=1;i<=T;i++)
{
Q=read()-last; //last是处理加密的问题
last=ansa[Q];
printf("%I64d %I64d\n",ansa[Q],ansb[Q]);
}
return 0;
}

  

2014.8.4我出的模拟赛【你的名字叫czy是吧】的更多相关文章

  1. 2014.8.4我出的模拟赛【NTR酋长】

    NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长 ...

  2. 【20170521校内模拟赛】热爱生活的小Z

    学长FallDream所出的模拟赛,个人感觉题目难度还是比较适中的,难度在提高+左右,可能比较接近弱省省选,总体来讲试题考查范围较广,个人认为还是很不错的. 所有试题如无特殊声明,开启-O2优化,时限 ...

  3. 2014.7.8模拟赛【笨笨当粉刷匠】|bzoj1296 [SCOI]粉刷匠

    笨笨太好玩了,农田荒芜了,彩奖用光了,笨笨只好到处找工作,笨笨找到了一份粉刷匠的工作.笨笨有n条木板需要被粉刷.每条木板被分成m个格子,每个格子要被刷成红色或蓝色.笨笨每次粉刷,只能选择一条木板上一段 ...

  4. 2014-11-3 NOIP模拟赛2

    NOIP 2014 水题模拟赛 (请选手务必仔细阅读本页内容) 一.题目概况 中文题目名称 数列 刷漆 排队 英文题目与子目录名 seq paint layout 可执行文件名 seq paint l ...

  5. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  6. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  7. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  8. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  9. 小奇模拟赛9.13 by hzwer

    2015年9月13日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...

随机推荐

  1. OpenWRT 编译 error GNU libiconv not in use but included iconv.h is from...

    OpenWRT 编译 error GNU libiconv not in use but included iconv.h is from... 编译的时候碰到一个常见的错误,但是却在一个陌生的地方爆 ...

  2. shell 中如何判断前一个命令是否执行成功

    shell 中如何判断前一个命令是否执行成功 通过判断返回值来解决: if [ $? -eq 0 ];then 命令正确的分支 else   命令失败的分支 fi

  3. 【转】如何在ubuntu12.04设置adb驱动

    原文网址:http://www.xuebuyuan.com/1475698.html 在ubuntu上adb驱动不用像在windows上一样需要额外装,只需要写一个配置文件就可以,下面是设置的步骤: ...

  4. 案例:用JS实现放大镜特效

    案例:用JS实现放大镜特效 案例:用JS实现放大镜特效

  5. 判断包含字符String.contains

    Java String.contains()方法用法实例教程, 返回true,当且仅当此字符串包含指定的char值序列 java.lang.String.contains() 方法返回true,当且仅 ...

  6. ios delegate 和 block

    //委托的协议定义 @protocol UpdateDelegate <NSObject> - (void)update; @end @interface Test : NSObject ...

  7. JUnit4中的测试套件

    测试套件 JUnit3.8中,用测试套件同时运行多个测试类(http://www.cnblogs.com/mengdd/archive/2013/04/07/3006265.html). 在JUnit ...

  8. iOS tableView的图片缓存异步载入

    1.建立一个viewController. .h文件实现UIScrollViewDelegate和UITableViewDelegate,并声明ICTableViewDelegate(用来实现图片有缓 ...

  9. IOS总结_无需自己定义UITabbar也可改变UITabbarController的背景和点击和的颜色

    在application: application didFinishLaunchingWithOptions: launchOptions 增加以下代码就能够实现对tabbar的颜色的改动 //设定 ...

  10. linux 系统监控系列之vmstat

    vmstat的官方定义是:vmstat - Report virtual memory statistics,即虚拟内存的统计. 先来追根溯源: 什么是虚拟内存? 答:虚拟内存就是磁盘上虚拟出来可以当 ...