好玩的推式子

题目描述

曾经发明了脑洞治疗仪与超能粒子炮的发明家 SHTSC 又公开了他的新发明:超能粒子炮・改——一种可以发射威力更加强大的粒子流的神秘装置。

超能粒子炮・改相比超能粒子炮,在威力上有了本质的提升。它有两个参数 \(n\)、\(k\),它会向每个编号为 \(0\) 到 \(k\)(包含两端)的位置 \(i\) 发射威力为 \(\mathrm{C}_n^i \bmod 2333\) 的粒子流。

现在 SHTSC 给出了他的超能粒子炮・改的参数,让你求出其发射的粒子流的威力之和除以 \(2333\) 所得的余数。

输入格式:

第一行一个整数 \(t\) 表示数据组数。

之后 \(t\) 行,每行两个整数 \(n\)、\(k\),含义如题面描述。

输出格式:

\(t\) 行,每行一个整数,表示其粒子流的威力之和模 \(2333\) 的值。

输入输出样例

输入样例:

3
5 5
10 7
1145 14

输出样例:

32
968
763

数据范围与约定

对于 \(10\%\) 的数据,\(t=1\),\(n,k\le 1000\);

对于 \(30\%\) 的数据,\(t=1\),\(n,k\leq 1000000\);

对于 \(50\%\) 的数据,\(t=1\),\(n\le 10^{18},k\le 1000\);

对于 \(70\%\) 的数据,\(t\le 100\),\(n,k\le 10^{18}\);

对于 \(100\%\) 的数据,\(t\le 100000\),\(n,k\le 10^{18}\)。

题解:

注:本文中所有的除法 \(/\) 都向下取整,所有的百分号 \(\%\) 都表示取模。

这个题求的是 \(\sum_{i=0}^k\mathrm{C}_n^i\bmod 2333\)。但是模数是 \(2333\) 因此可以考虑 Lucas 定理,即 \(\mathrm{C}_n^m\% p=\mathrm{C}_{n\% p}^{m\% p}\mathrm{C}_{n/p}^{m/p}\)。

我们把上面的和式推导一下,则为

\[\sum_{i=0}^k\mathrm{C}_{n/2333}^{i/2333}\mathrm{C}_{n\%2333}^{i\%2333}
\]

然后我们发现,整个过程中 \(n/2333\) 和 \(n\% 2333\) 是不变的。只需要关注 \(i/2333\) 和 \(i\%2333\) 的变化规律。

而对于连续的 \(i\in[2333k,2333k+2333)\) 它们的 \(i/2333\) 是相同的,\(i\%2333\in[0,2333)\),所以我们把需要求和的 \(k\) 个数分成 \(\left\lceil\frac{k}{2333}\right\rceil\) 段。其中前 \(\left\lfloor\frac{k}{2333}\right\rfloor\) 段一定是完整的,因此可以表示为

\[\sum_{t=0}^{\left\lfloor\frac{k}{2333}\right\rfloor}\mathrm{C}_{n/2333}^t\sum_{i=0}^{2332}\mathrm{C}_{n\%2333}^i+\sum_{i=k-k\%2333}^k\mathrm{C}_{n/2333}^{i/2333}\mathrm{C}_{n\%2333}^{i\%2333}
\]

对于加号后面的式子,\(i/2333=0\),所以是对后面一个式子求和,因此可以用杨辉三角预处理,并求出前缀和,\(O(1)\) 解决。

对于中间一个式子 \(\sum_{i=0}^{2332}\mathrm{C}_{n\%2333}^i\) ,因为 \(n\%2333<2333\) ,同理用杨辉三角。

\[\sum_{i=0}^{2332}\mathrm{C}_{n\%2333}^i=S,\\\ \sum_{i=k-k\%2333}^k\mathrm{C}_{n/2333}^{i/2333}\mathrm{C}_{n\%2333}^{i\%2333}=A
\]

则原式为

\[S\sum_{t=0}^{\left\lfloor\frac{k}{2333}\right\rfloor}\mathrm{C}_{n/2333}^t+A
\]

对于剩下的一个式子,又转化为了一个求和的子问题,因此我们递归解决。递归的边界是 \(k<2333\)。

因此可以在 \(2333^2+O(t\log k)\) 的时间复杂度内解决这个问题。

Code:

#include<cstdio>
#define ll long long
ll C[2333][2333];
ll calc(ll n,ll t)//0~t的C_n^t
{
ll ans=0,p=n%2333;
if(t/2333)
ans=C[p][p]*calc(n/2333,t/2333-1)%2333;
else
return C[p][t%2333];
ll a=n/2333,b=t/2333,tmp=1;
while(a>=2333||b>=2333)
{
if(b%2333)
tmp=tmp*(C[a%2333][b%2333]-C[a%2333][b%2333-1]+2333)%2333;
a/=2333,b/=2333;
}
if(b)
tmp=tmp*(C[a][b]-C[a][b-1]+2333)%2333;
ans=(ans+C[p][t%2333]*tmp)%2333;
return ans;
}
int main()
{
C[0][0]=1;
for(int i=1;i<=2332;++i)
{
C[i][0]=1;
for(int j=1;j<=i;++j)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%2333;
}
for(int i=0;i<=2332;++i)
for(int j=1;j<=2332;++j)
C[i][j]=(C[i][j-1]+C[i][j])%2333;
int T;
ll n,k;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&n,&k);
printf("%lld\n",calc(n,k));
}
return 0;
}

loj 2038 / 洛谷 P4345 [SHOI2015] 超能粒子炮・改 题解的更多相关文章

  1. 洛谷 P4345 [SHOI2015]超能粒子炮·改 解题报告

    P4345 [SHOI2015]超能粒子炮·改 题意 求\(\sum_{i=0}^k\binom{n}{i}\),\(T\)组数据 范围 \(T\le 10^5,n,j\le 10^{18}\) 设\ ...

  2. [洛谷P4345][SHOI2015]超能粒子炮·改

    题目大意:给你$n,k$,求:$$\sum\limits_{i=0}^k\binom n i\pmod{2333}$$题解:令$p=2333,f(n,k)\equiv\sum\limits_{i=0} ...

  3. bzoj4591 / P4345 [SHOI2015]超能粒子炮·改

    P4345 [SHOI2015]超能粒子炮·改 题意:求$\sum_{i=1}^{k}C(n,i)\%(P=2333)$ 肯定要先拆开,不然怎么做呢(大雾) 把$C(n,i)$用$lucas$分解一下 ...

  4. P4345 [SHOI2015]超能粒子炮·改 Lucas

    \(\color{#0066ff}{ 题目描述 }\) 曾经发明了脑洞治疗仪与超能粒子炮的发明家 SHTSC 又公开了他的新发明:超能粒子炮・改--一种可以发射威力更加强大的粒子流的神秘装置. 超能粒 ...

  5. P4345 [SHOI2015]超能粒子炮·改

    传送门 看到数据和模数大小就知道要上 lucas 了 然后开始愉快地推公式: 答案为 $\sum _{i=0}^kC_{n}^{i}\ (mod\ 2333)$ 设 $f [ i ] [ j ] = ...

  6. 【BZOJ4591】[SHOI2015]超能粒子炮·改 (卢卡斯定理)

    [BZOJ4591][SHOI2015]超能粒子炮·改 (卢卡斯定理) 题面 BZOJ 洛谷 题解 感天动地!终于不是拓展卢卡斯了!我看到了一个模数,它是质数!!! 看着这个东西就感觉可以递归处理. ...

  7. Bzoj 4591: [Shoi2015]超能粒子炮·改 数论,Lucas定理,排列组合

    4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 178  Solved: 70[Submit][Stat ...

  8. bzoj 4591: [Shoi2015]超能粒子炮·改 [lucas定理]

    4591: [Shoi2015]超能粒子炮·改 题意:多组询问,求 \[ S(n, k) = \sum_{i=0}^n \binom{n}{i} \mod 2333,\ k \le n \le 10^ ...

  9. BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理

    BZOJ_4591_[Shoi2015]超能粒子炮·改_Lucas定理 Description 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以 ...

随机推荐

  1. Unity ios、android、pc一键打包(一)

    http://www.cnblogs.com/miaoshujiang/p/5289223.html http://blog.csdn.net/ynnmnm/article/details/36774 ...

  2. Codeforces 1120C Compress String(DP)

    题意:给你一个字符串,有2种消除方式:1:消除一个单独的字母,代价为a.2:s[j]到s[k]是s[1]到s[j - 1]的子串,那么s[j]到s[k]可以消除,代价为b,问最小的代价. 思路:官方题 ...

  3. wdcp挂载数据盘为WWW以及之后出现的各种问题解决方法

    昨天晚上突然有客户反映服务器访问不了,经检查后是因为磁盘满了! 购买阿里云的ECS选择linux系统的时候会赠送20G的系统盘,通常来讲自己用的话基本够了,但是我们作为网络公司,安装了一个WDCP后给 ...

  4. springboot @Value 类中读取配置文件 .properties null 原因和解决方案

    问题:在一个工具类中,通过@Value来映射配置文件的值,得到的总是null 原因:不能用new工具类的方式,应该是用容器注册(@Autowried)的方式使用此工具类,就能得到配置文件里的值 上代码 ...

  5. (函数)实现strstr函数

    题目:实现strstr函数. 这个函数原型 strstr(char *a, char *b),在a中是否包含b这个字符串,包含返回第一个子串的位置,否则返回NULL. 思路:其实这个就是找子串的问题. ...

  6. 【Head First Java 读书笔记】(一)基本概念

    Java的工作方式 你要做的事情就是会编写源代码 Java的程序结构 类存于源文件里面 方法存在类中 语句存于方法中 剖析类 当Java虚拟机启动执行时,它会寻找你在命令列中所指定的类,然后它会锁定像 ...

  7. MongoDB整理笔记の安装及配置

    1.官网下载 地址:http://www.mongodb.org/downloads mongodb-linux-x86_64-2.4.9.tgz (目前为止,64位最新版本) 2.解压 切换到下载目 ...

  8. 最全面的jackson json 技术

    http://www.360doc.com/content/12/0429/09/7656232_207428466.shtml

  9. Js 正则获取Html元素

    var html = $("#summaryTemplate").html(); var imageMath = /<img [^<,>]*(?=target-t ...

  10. HashMap数据结构的C++实现

    Hash表在计算机的应用编程中是一种很常用的数据结构,很多算法的实现都离不开它.虽然C++11标准模板库中的有hashmap类型的实现,但在工程实践中,若项目本身使用的是较低版本的C++,或是出于性能 ...