[CSP-S模拟测试]:数学课(找规律+数学)
题目传送门(内部题145)
输入格式
从$math.in$读入数据。
第一行两个数,为$n,q$。接下来$q$行每行一个数$m$,询问大小为$m$的$A$一共有多少个。
输出格式
输出答案到$math.out$。
共$q$行,每行一个数,表示方案数$\mod 10000019$。
样例
样例输入1:
3 3
0
1
2
样例输出1:
0
2
2
样例输入2:
100 4
45
50
60
70
样例输出2:
2085406
6657572
7844331
0
数据范围与提示
样例解释:
对于第一个样例,$P=\{1,2,3\}$,$A$可以选$\{1\},\{2\},\{1,3\},\{2,3\}$,大小为$1$的两种,大小为$2$的也有两种。对于第二个样例,我想到了一个绝妙的解释,可惜这里写不下。
数据范围:
$subtask1:20pts,n,m,q\leqslant 20$。
$subtask2:30pts,n,m,q\leqslant 5,000$。
$subtask3:30pts,n,m\leqslant 10,000,000,q\leqslant 100,000$。
$subtask4:20pts,n,m\leqslant 10^{18},q\leqslant 100,000$。
题解
又是找规律,但是我为什么总是找不出来。
先说一下我考场上的做法,因为$x$和$2x$不能在一个集合,所以$x$和$4x$就必须在一个集合,以此类推,$\Theta(n^2)DP$就有了。
然后发现相同的$n$其实就是杨辉三角中的一行乘上一个系数,二分找到是哪一行就好了……
时间复杂度:$\Theta(q\log_{mod} n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
const int mod=10000019;
long long n,m;
int q;
long long fac[mod],inv[mod];
long long cnt,base,val=1;
long long qpow(long long x,long long y)
{
long long res=1;
if(y<0)return 0;
while(y)
{
if(y&1)res=res*x%mod;
x=x*x%mod;y>>=1;
}
return res;
}
void pre_work()
{
fac[0]=1;
for(int i=1;i<mod;i++)fac[i]=fac[i-1]*i%mod;
inv[mod-1]=qpow(fac[mod-1],mod-2);
for(int i=mod-1;i;i--)inv[i-1]=inv[i]*i%mod;
}
long long lucas(long long x,long long y)
{
if(x<y)return 0;
return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
long long C(long long x,long long y)
{
if(!y)return 1;
return lucas(x%mod,y%mod)*C(x/mod,y/mod)%mod;
}
int main()
{
pre_work();
scanf("%lld%d",&n,&q);
for(long long i=1,j=2;j<=n*2;i++,j<<=1)
{
long long L=1,R=n+1;
long long l=1,r=n+1;
while(l<r)
{
long long mid=(l+r)>>1;
if(ceil(log2(n/mid+1))>i)l=mid+1;
else r=mid;
}
while(L<R)
{
long long mid=(L+R)>>1;
if(ceil(log2(n/mid+1))>=i)L=mid+1;
else R=mid;
}
long long x;
if(L&1)x=(L-l)/2;
else x=(L-l+1)/2;
base+=i/2*x;
if(i&1)cnt+=x;
else val=val*qpow(2,x%(mod-1))%mod;
}
while(q--)
{
scanf("%lld",&m);
m-=base;
if(m<0||cnt<m)puts("0");
else printf("%lld\n",val*C(cnt,m)%mod);
}
return 0;
}
rp++
[CSP-S模拟测试]:数学课(找规律+数学)的更多相关文章
- [CSP-S模拟测试]:排列组合(数学 or 找规律)
题目描述 $T$组数据,每次给定$n$,请求出下式的值,对$10^9+7$取模: $$C_n^0\times C_n^0+C_n^1\times C_n^1+C_n^2\times C_n^2+... ...
- [CSP-S模拟测试]:B(DP+数学)
题目传送门(内部题45) 输入格式 第一行$3$个整数$n,m,P$.第二行$m$个整数,表示$m$次询问. 输出格式 一行$m$个整数表示答案. 样例 样例输入1: 2 4 40 1 2 3 样例输 ...
- [CSP-S模拟测试]:次芝麻(数学)
题目描述 小$K$和小$X$都是小次货.身为小次货,最重要的事情就是次啦!所以他们正在纠结如何分芝麻次.一开始,小$K$有$n$个芝麻,小$X$有$m$个芝麻.因为他们都想次更多芝麻,所以每次手中芝麻 ...
- Codeforces 1091D New Year and the Permutation Concatenation 找规律,数学 B
Codeforces 1091D New Year and the Permutation Concatenation https://codeforces.com/contest/1091/prob ...
- [CSP-S模拟测试]:题(DP+数学)
题目描述 出个题就好了.这就是出题人没有写题目背景的原因.你在平面直角坐标系上.你一开始位于$(0,0)$.每次可以在上/下/左/右四个方向中选一个走一步.即:从$(x,y)$走到$(x,y+1),( ...
- [CSP-S模拟测试]:旋转子段(数学)
题目描述 $ZYL$有$N$张牌编号分别为$1,2,...,N$.他把这$N$张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第$i$个位置的牌的编号为$i$,我们就称之为固定点.旋 ...
- [CSP-S模拟测试]:画作(BFS+数学)
题目描述 小$G$的喜欢作画,尤其喜欢仅使用黑白两色作画.画作可以抽象成一个$r\times c$大小的$01$矩阵.现在小$G$构思好了了他的画作,准备动笔开始作画.初始时画布是全白的,他每一次下笔 ...
- [CSP-S模拟测试]:斯诺(snow)(数学+前缀和+树状数组)
题目传送门(内部题37) 输入格式 第一行一个整数$n$,表示区间的长度. 第二行一个长度为$n$的只包含$0,1,2$的字符串,表示给出的序列. 输出格式 一行一个整数,表示革命的区间的数量. 样例 ...
- HDU 1577 WisKey的眼神 (找规律 数学)
题目链接 Problem DescriptionWisKey的眼镜有500多度,所以眼神不大好,而且他有个习惯,就是走路喜欢看着地(不是为了拣钱哦^_^),所以大家下次碰见他的时候最好主动打下招呼,呵 ...
随机推荐
- js修改当前页面地址栏参数
利用HTML5 history新特性replaceState方法可以修改当前页面地址栏参数,示例代码: //选择日期后改变地址栏 var urlSearch = location.href; var ...
- Laravel save部分字段失效的bug问题解决
问题描述:今天在编写api的更新部分,发现有部分字段怎么更新都更新不上去. 问题排查: 经过多次测试,发现每次提交只能更新部分字段,字段分别为:id,user_id,device_room_id,na ...
- Groovy--使用模板引擎和GroovyShell执行插值字符串
package curveJudge import groovy.text.SimpleTemplateEngine /** * Created by Jxy on 2019/8/26 17:16 * ...
- netty的断线重连问题
手里的这个项目需要作为客户端,不断的接收服务端发来的数据,用的netty框架,但是一直存在一个问题,就是断线重连问题. 什么是断线重连呢? 就是我们这个客户端要保证一直与服务端保持连接,这样客户端才能 ...
- Base64加密后有换行回车的解决办法
据RFC 822规定,每76个字符,还需要加上一个回车换行 有时就因为这些换行弄得出了问题,解决办法如下,替换所有换行和回车 String bTemp = Base64.encodeBase64Str ...
- linux递归查找目录下所有文件夹以及文件
相对于ls或者ll,可能find在这个时候更加给力 先看我的目录结构 tree命令是查看目录的结构,而且最后会列出所有的directory的数目以及文件夹的数目...好像我们接下来要做的就没有必要了, ...
- linux重装docker-compose后无法执行docker-compose命令
背景 使用自动化脚本重装docker和docker-compose(但脚本中未对旧版本的docker-compose进行任何处理,比如卸载删除) 导致执行docker-compose命令时报了错,大多 ...
- 4.java JMS技术
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间, 或分布式系统中发 ...
- c++第四次作业:类的继承
一.定义 类的继承:是从新的类从已有类那里得到已有的特性. 二.方式 1.公有继承:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可直接访问. 例: ...
- IQ基础
I: in-phase 表示同相Q: quadrature 表示正交,与I 相位差90 度. 现在来解释IQ信号的来源: 最早通讯是模拟通讯,假设载波为cos(a),信号为cos(b),那么通过相 ...