[JZOJ 5810] 简单的玄学
思路:
就是考虑一个结论
对于\(1<=x<=2^n\),那么\(x\)与\(2^n - x\)中的2的个数相等。
证明:
我们将\(x\)表示成\(2^k*b\),那么\(2^n - x\)就是\(2^n - 2^k*b\)当消去\(k\)个2之后,剩下的就是\(2^n - b\)显然不能被2除了(因为b显然不是一个偶数),
那么我们推出来的概率式子为:
\(1 - {\prod_{i=2^n-m+1}^{2^n-1} i\over 2^{n(m-1)}}\)
问题的瓶颈就是如何求分子的2的个数,应用上面的结论可以将分子化为:
如何求\((m-1)!\)里的2的个数。
简单了,随便枚举一下就可以了。
值得一提的是,这题的数据范围有毒,考虑到当\(m > mod\)时,显然取模为0,所以出题人很好心的没有给\(10^{18}\)的点。
代码我不知道为什么老是爆炸...
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 1e6+3;
inline ll pow_mod(ll a,ll b) {
ll res = 1;
while(b) {
if(b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
ll n,m;
ll ans;
int main () {
freopen("random.in","r",stdin);
freopen("random.out","w",stdout);
scanf("%d %d",&n,&m);
if(m > mod) {
puts("0 0");
return 0;
}
if(log2(m) > n) {
puts("1 1");
return 0;
}
ll t1 = pow_mod(2,n);
ll t2 = pow_mod(t1,m-1);
for(int i = 1;i < m; ++i) {
int tmp = i;
while(!(tmp & 1)) {
ans ++;
tmp >>= 1;
}
}
ll fz = 1;
for(int i = 1;i < m; ++i) {
fz = fz * (t1 - i);
}
fz /= pow(2,ans);
ll fm = pow_mod(2,n*(m - 1) - ans);
printf("%lld %lld\n",(fm - fz)%mod,(fm)%mod);
return 0;
}
马力太弱。。
[JZOJ 5810] 简单的玄学的更多相关文章
- NOIP模拟测试「简单的区间·简单的玄学·简单的填数·简单的序列」
简单的区间 $update$ 终于$AC$了 找到$(sum[r]+sum[l](sum表示以中间点为基准的sum)-mx)\%k==0$的点 注意这里$sum$表示是以$mid$为基准点,(即$su ...
- noip模拟12[简单的区间·简单的玄学·简单的填数]
noip模拟12 solutions 这次考试靠的还是比较好的,但是还是有不好的地方, 为啥嘞??因为我觉得我排列组合好像白学了诶,文化课都忘记了 正难则反!!!!!!!! 害没关系啦,一共拿到了\( ...
- [CSP-S模拟测试]:简单的玄学(数学)
题目描述 有$m$个在$[0,2^n)$内均匀随机取值的整型变量,球至少有两个变量取值相同的概率.为了避免精度误差,假设你的答案可以表示成$\frac{a}{b}$的形式,(其中$(a,b)=1$), ...
- [JZOJ 5811] 简单的填数
题意:自己搜吧... 思路: 记二元组\((x,l)\)表示当前为\(x\)且之前有\(l\)个连续数与\(x\)相同. 并且维护up和low数组表示取到最大/最小值时,连续序列的长度. 正一遍,反一 ...
- [JZOJ 5807] 简单的区间
题目: 求有多少组二元组\((l,r)\)使得:\(1<=l<=r<=n,k|f(l,r)\) \(f(l,r) = \sum_{i=l}^{r}a_i - max_{i=l}^{r ...
- [JZOJ 5804] 简单的序列
思路: 似乎和某次培训的题很像啊... 将左括号记为1,右括号记为-1,那么最终一定加和为0,然后再求最小前缀和. 用dp解决即可. #include <bits/stdc++.h> us ...
- NOIP 模拟 $12\; \text{简单的玄学}$
题解 有些难度 对于 \(30pts\) 直接暴力 对于 \(70pts\) 发现规律 \(2^n-a\) 与 \(a\;\;(a\in [1,2^n))\) 分解质因数后,\(2\) 的次数相同 \ ...
- 又联考了一场,感觉自己好菜啊,T2推出了公式但是不会逆元QAQ,难受啊!!!不过都确实是一道逆元的好题撒!
简单的玄学(random) 题目描述: 样例输入: 样例1: 3 2 样例2: 1 3 样例3: 4 3 样例输出: 样例1: 1 8 样例2: 1 1 样例3: 23 128 提示: 时间限制:10 ...
- [NOIP模拟测试37]反思+题解
一定要分析清楚复杂度再打!!!窝再也不要花2h20min用暴力对拍暴力啦!!! 雨露均沾(滑稽),尽量避免孤注一掷.先把暴力分拿全再回来刚正解. 即使剩下的时间不多了也优先考虑认真读题+打暴力而非乱搞 ...
随机推荐
- HTML5 worker计数器简单示例
效果图: index.html var w; // 开始 function startWorker() { if (typeof (Worker) !== "undefined") ...
- delphi 文件夹操作
文件的拖放和打开拖拽 user shellapi type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sende ...
- /etc/fstab修改及mkfs(e2label)相关应用与疑问
http://blog.chinaunix.net/uid-23392298-id-62318.html 我们将以问题开始说明: 案例: 由于n年前的误操作,导致系统启动的时候,提示如下错误:Coul ...
- 调试口:JTAG与SW-Debug Port
- linux top监控的使用
b : toggle highlight x : toggle sort row highlight shift + < > : switch sort row
- LintCode 汉诺塔
题目链接:https://www.lintcode.com/problem/tower-of-hanoi/description 题目大意 经典递归问题. 分析 由于是经典问题了,这里不讨论用递归实现 ...
- Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...
- 调用phone库,查询手机号码归属地(4)
需要安装pymysql,phone库 #!/usr/bin/python # -*- coding: utf-8 -*- import sys, pymysql, logging, phone fro ...
- hdu 3123 2009 Asia Wuhan Regional Contest Online
以为有啥牛逼定理,没推出来,随便写写就A了----题非常水,可是wa了一次 n>=m 则n!==0 注意的一点,最后 看我的凝视 #include <cstdio> #includ ...
- C语言之文件包含
c = #include <stdio.h> #include "A.h" int main() { /******************************** ...