题目描述

有$m$个在$[0,2^n)$内均匀随机取值的整型变量,球至少有两个变量取值相同的概率。
为了避免精度误差,假设你的答案可以表示成$\frac{a}{b}$的形式,(其中$(a,b)=1$),你需要输出$a$和$b$对${10}^6+3$取模后的值。


输入格式

第一行两个正整数$n,m$。


输出格式

一行两个整数,它们的含义如题所述。


样例

样例输入1:

3 2

样例输出1:

1 8

样例输入2:

1 3

样例输出2:

1 1

样例输入3:

4 3

样例输出3:

23 128


数据范围与提示

对于$10\%$的数据,$nm<16$;
对于$30\%$的数据,$nm<64$;
对于$50\%$的数据,$nm\leqslant {10}^3$;
对于$70\%$的数据,$m\leqslant {10}^6$;
对于$100\%$的数据,$1\leqslant n\leqslant {10}^{18},2\leqslant m\leqslant {10}^{18}$。


题解

数学题就要推式子。

显然这个概率就是$\dfrac{A_{2^2}^m}{2^{nm}}$,也就是$\dfrac{\prod \limits_{i=2^n-m+1}^{2^n-1}}{2^{n(m-1)}}$。

看起来很恐怖,其实如果$m>{10}^6+3$那么在连乘的过程中肯定会有其中一项是$0$,那么结果就是$0$。

但是我们要输出$gcd(a,b)=1$的分子和分母,所以我们还得约分……

发现我们只能约分出来$2$和$2$的倍数,所以我们考虑如何求出来有多少个$2$。

考虑$a$中$2$的个数和$2^n-a$中$2$的个数相同,所以我们只需要求出$(m-1)!$中$2$的个数即可,可以用一种类似快速幂的思想在$\Theta(\log m)$的时间复杂度内求出,然后约掉这些$2$就是最简分数啦。

时间复杂度:$\Theta(m)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long fz,fm;
long long qpow(long long x,long long y)
{
long long res=1;
while(y)
{
if(y&1)res=res*x%1000003;
x=x*x%1000003;
y>>=1;
}
return res;
}
int main()
{
scanf("%lld%lld",&n,&m);
n%=1000002;
int flag=65;
long long pos=1,fj=0;
while(flag--)
{
pos<<=1;
if(pos>=m)break;
fj=(fj+(m-1)/pos)%1000002;
}
long long inv=qpow(qpow(2,fj),1000001);
long long C=qpow(2,n);
fm=qpow(C,(m-1)%1000002)*inv%1000003;
if(m<=1000003)
{
fz=inv;
for(int i=1;i<m;i++)
fz=fz*(C-i+1000003)%1000003;
fz=(fm-fz+1000003)%1000003;
printf("%lld %lld",fz,fm);
}
else printf("%lld %lld",fm,fm);
return 0;
}

rp++

[CSP-S模拟测试]:简单的玄学(数学)的更多相关文章

  1. [CSP-S模拟测试]:简单计算(数学)

    题目传送门(内部题104) 输入格式 第一行一个正整数$T$,表示该测试点内的数据组数,你需要对该测试点内的$T$组数据都分别给出正确的答案才能获得该测试点的分数. 接下来$T$组数据,每组数据一行两 ...

  2. [CSP-S模拟测试]:题(DP+数学)

    题目描述 出个题就好了.这就是出题人没有写题目背景的原因.你在平面直角坐标系上.你一开始位于$(0,0)$.每次可以在上/下/左/右四个方向中选一个走一步.即:从$(x,y)$走到$(x,y+1),( ...

  3. [CSP-S模拟测试]:B(DP+数学)

    题目传送门(内部题45) 输入格式 第一行$3$个整数$n,m,P$.第二行$m$个整数,表示$m$次询问. 输出格式 一行$m$个整数表示答案. 样例 样例输入1: 2 4 40 1 2 3 样例输 ...

  4. [CSP-S模拟测试]:简单的括号序列(组合数)

    题目传送门(内部题82) 输入格式 一行一个字符串$ss$,保证$ss$中只包含$'('$和$')'$. 输出格式 一行一个整数,表示满足要求的子序列数对$10^9+7$的结果. 样例 样例输入1: ...

  5. [CSP-S模拟测试]:C(倍增+数学)

    题目传送门(内部题152) 输入格式 第一行两个整数$N,Q$. 接下来一行$N$个整数,第$i$个为$a_i$. 接下来的$N-1$行,每行两个整数$u,v$.表示$u,v$之间有一条边. 接下来的 ...

  6. [CSP-S模拟测试]:物理课(数学)

    题目传送门(内部题144) 输入格式 从$physics.in$读入数据. 第一行一个数$T$,代表有$T$组数据.接下来$T$行每行$4$个浮点数,分别为$\theta,v,d,g$,保留到小数点后 ...

  7. [CSP-S模拟测试]:最大或(数学)

    题目传送门(内部题141) 输入格式 输入文件包含多组测试数据,第一行为一个正整数$T$,表示数据组数. 接下来$T$行,每行两个正整数$l,r$.数据保证$l\leqslant r$成立. 输出格式 ...

  8. [CSP-S模拟测试]:平方数(数学+哈希)

    题目传送门(内部题137) 输入格式 第一行,一个正整数$n$. 第二行$n$个正整数$a_1\sim a_n$. 输出格式 输出一个整数,为满足条件的二元组个数. 样例 样例输入: 51 2 3 4 ...

  9. [CSP-S模拟测试]:异或(数学)

    题目描述 给定$L,R$,我们希望你求出:$$\sum\limits_{i=L}^R\sum\limits_{j=L}^R(i\oplus j)$$其中这里的$\oplus$表示异或运算.答案对$10 ...

随机推荐

  1. Python基础教程(013)--一行代码不要做多件事情

    前言 学习代码编写风格 内容 语法错误报错的信息 SystaxErrot:invalid syntax 语法错误, invalid 无效 每行代码负责完成一个动作 阅读代码,从左至右,从上到下. 学习 ...

  2. truncate与delete删除数据的区别

  3. SQLserver查询作业、视图、函数、存储过程中的关键字

    一.查询视图.函数.存储过程中的关键字 SELECT a.name,a.[type],b.[definition] FROM sys.all_objects a,sys.sql_modules b W ...

  4. inputAccessoryView,inputView

    我们在使用UITextView和UITextField的时候,可以通过它们的inputAccessoryView属性给输入时呼出的键盘加一个附属视图,通常是UIToolBar,用于回收键盘. 但是当我 ...

  5. Intel processor brand names-Xeon,Core,Pentium,Celeron----Xeon

    http://en.wikipedia.org/wiki/Comparison_of_Intel_processors Processor Series Nomenclature Code Name ...

  6. css浮动以及清除

    首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下图: 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为d ...

  7. 2019 SCUT SE 新生训练第四波 L - Boxes in a Line——双向链表

    先上一波题目 https://vjudge.net/contest/338760#problem/L 这道题我们维护一个双向链表 操作1 2 3 都是双向链表的基本操作 4操作考虑到手动将链表反转时间 ...

  8. 牛客网挑战赛24 青蛙(BFS)

    链接:https://www.nowcoder.com/acm/contest/157/E来源:牛客网 有一只可爱的老青蛙,在路的另一端发现了一个黑的东西,想过去一探究竟.于是便开始踏上了旅途 一直这 ...

  9. js 对象 window,parent,top,opener,document

    Js 对象 window top parentWindow 当前html 页面Parent 当前html 页面的父页面Top 当前html页面的祖页面Window ==parent = top 当前页 ...

  10. go语言从例子开始之Example20.错误处理

    Go 语言使用一个独立的·明确的返回值来传递错误信息的.这与使用异常的 Java 和 Ruby 以及在 C 语言中经常见到的超重的单返回值/错误值相比,Go 语言的处理方式能清楚的知道哪个函数返回了错 ...