4591: [Shoi2015]超能粒子炮·改

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 178  Solved: 70
[Submit][Status][Discuss]

Description

曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加
强大的粒子流的神秘装置。超能粒子炮·改相比超能粒子炮,在威力上有了本质的提升。它有三个参数n,k。它会
向编号为0到k的位置发射威力为C(n,k) mod 2333的粒子流。现在SHTSC给出了他的超能粒子炮·改的参数,让你求
其发射的粒子流的威力之和模2333。

Input

第一行一个整数t。表示数据组数。
之后t行,每行二个整数n,k。含义如题面描述。
k<=n<=10^18,t<=10^5

Output

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

Sample Input

1
5 5

Sample Output

32

HINT

 

Source

By 佚名上传

题解:

Lucas定理:C(n,k)%p=(C(n/p,k/p)*C(n%p,k%p))%p    (p为质数)

C(n,k)%2333=C(n/2333,k/2333)*C(n%2333,k%2333)

 
分两种部分考虑:
设k=k1*2333+k2 (0≤k1,k2)
1.对于k1部分
C(n,0)……C(n,2332)

=C(n/2333,0)*C(n%2333,0)+C(n/2333,0)*C(n%2333,1)+……+C(n/2333,0)*C(n%2333,2332) = C(n/2333,0)*(∑C(n%2333,i)(0≤i≤2332)) ==> 2333个
C(n,2333)……C(n,4665)

=C(n/2333,1)*C(n%2333,0)+C(n/2333,1)*C(n%2333,1)+……+C(n/2333,1)*C(n%2333,2332) = C(n/2333,1)*(∑C(n%2333,i)(0≤i≤2332)) ==> 2333个
C(n,4666)……C(n,6998)
=C(n/2333,2)*C(n%2333,0)+C(n/2333,2)*C(n%2333,1)+……+C(n/2333,2)*C(n%2333,2332) = C(n/2333,2)*(∑C(n%2333,i)(0≤i≤2332)) ==> 2333个
C(n,6999)……C(n,9331)
=C(n/2333,3)*C(n%2333,0)+C(n/2333,3)*C(n%2333,1)+……+C(n/2333,3)*C(n%2333,2332) = C(n/2332,3)*(∑C(n%2333,i)(0≤i≤2332)) ==> 2333个
…………
所以k1部分的总和sum=(∑C(n%2333,i)(0≤i≤2332))*(∑C(n/2333,j)(0≤j≤k1-1))
 
2.对于k2部分
C(n,k1*2333)……C(n,k)
=C(n/2333,k1)*C(n%2333,0)+C(n/2333,k1)*C(n%2333,1)+……+C(n/2333,k1)*C(n%2333,k%2333) ==> k%2333+1个
=C(n/2333,k1)*(∑C(n%2333,i)(0≤i≤k%2333))
 
由以上可得ans=(∑C(n%2333,i)(0≤i≤2332))*(∑C(n/2333,j)(0≤j≤k1-1))+C(n/2333,k1)*(∑C(n%2333,i)(0≤i≤k%2333))
 
预处理 S(n,k)=∑C(n,i)(0≤i≤k),化简ans=S(n%2333,2332)*(∑C(n/2333,j)(0≤j≤k1-1))+C(n/2333,k1)*S(n%2333,k%2333)
因为n%2333一定小于2333,所以可以用二维数组S(n,k)表示。但 ∑C(n/2333,j)(0≤j≤k1-1) 中n/2333可能很大,无法用二维数组存储,所以不把 ∑C(n/2333,j)(0≤j≤k1-1) 化简为 S(n/2333,k1-1)。但是可以发现 ∑C(n/2333,j)(0≤j≤k1-1) 与 要求的最终答案的公式的格式 ∑C(n,i)(0≤i≤k) 一样,所以可以递归求解。另外ans中的C(n/2333,k1)可以用Lucas定理求解。
 
 #include<bits/stdc++.h>
using namespace std;
#define LL long long
#define MOD 2333
LL jc[MOD+],C[MOD+][MOD+],S[MOD+][MOD+];
LL read()
{
LL s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
LL mod(LL k,LL k1){return k-(k/k1)*k1;}
void cljc()
{
jc[]=1LL;
for(int i=;i<=MOD;i++)jc[i]=mod(jc[i-]*i,MOD);
}
void clC()
{
int i,j;
C[][]=1LL;
for(i=;i<=MOD;i++)
{
C[i][]=C[i][i]=1LL;
for(j=;j<i;j++)C[i][j]=mod(C[i-][j]+C[i-][j-],MOD);
}
for(i=;i<=MOD;i++)
{
S[i][]=1LL;
for(j=;j<=MOD;j++)S[i][j]=mod(S[i][j-]+C[i][j],MOD);
}
}
LL ksm(LL bb,LL pp,LL kk)
{
LL s=1LL;
while(pp>)
{
if(pp%!=)s=mod(s*bb,kk);
pp/=;
bb=mod(bb*bb,kk);
}
return s;
}
LL Comb(LL n,LL m,LL p)
{
if(m>n)return 0LL;
if(m>n-m)m=n-m;
return mod(jc[n]*ksm(mod(jc[m]*jc[n-m],p),p-,p),p);
}
LL Lucas(LL n,LL m,LL p)
{
if(m==0LL)return 1LL;
return mod(/*Comb(mod(n,p),mod(m,p),p)*/C[n%p][m%p]*Lucas(n/p,m/p,p),p);
}
LL getans(LL n,LL m,LL p)
{
if(m<0LL)return 0LL;
return mod(mod(S[mod(n,)][]*getans(n/,m/-,p),p)+mod(Lucas(n/,m/,p)*S[mod(n,)][mod(m,)],p),p);
}
int main()
{
LL T,n,k;
cljc();
clC();
T=read();
while(T--)
{
n=read();k=read();
printf("%lld\n",getans(n,k,MOD));
}
fclose(stdin);
fclose(stdout);
return ;
}

Bzoj 4591: [Shoi2015]超能粒子炮·改 数论,Lucas定理,排列组合的更多相关文章

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

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

  2. 【BZOJ4591】超能粒子炮·改(Lucas定理,组合计数)

    题意: 曾经发明了脑洞治疗仪&超能粒子炮的发明家SHTSC又公开了他的新发明:超能粒子炮·改--一种可以发射威力更加 强大的粒子流的神秘装置.超能粒子炮·改相比超能粒子炮,在威力上有了本质的提 ...

  3. bzoj 4591 [Shoi2015]超能粒子炮·改——组合数前缀和

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4591 先说说自己的想法: 从组合意义的角度考虑,从n个里选<=k个,就添加k个空位置, ...

  4. luogu4345 [SHOI2015]超能粒子炮·改(组合数/Lucas定理)

    link 输入\(n,k\),求\(\sum_{i=0}^k{n\choose i}\)对2333取模,10万组询问,n,k<=1e18 注意到一个2333这个数字很小并且还是质数这一良好性质, ...

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

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

  6. BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)

    注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...

  7. P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】

    正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 \(T\)组询问,给出\(n,k\)求 \[\sum_{i=0}^{k}\binom{n}{i} ...

  8. 【BZOJ-4591】超能粒子炮·改 数论 + 组合数 + Lucas定理

    4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 95  Solved: 33[Submit][Statu ...

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

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

随机推荐

  1. Deep Learning and the Triumph of Empiricism

    Deep Learning and the Triumph of Empiricism By Zachary Chase Lipton, July 2015 Deep learning is now ...

  2. ural 1108

    大数乘法    不会java   比赛的时候各种细节RE  WA  ........ #include <cstdio> #include <cstring> #include ...

  3. ie6 iframe src="javascript:" 报安全警报问题

    <iframe id="shuaka_iframe" class="embed-page-iframe" data-src="https://w ...

  4. 使用rsyslog+loganalzey收集日志显示客户端ip

    http://www.ituring.com.cn/article/128536 rsyslog localhost 转发 http://bigsec.net/one/tool/rsyslog.htm ...

  5. CodeForces 299A Ksusha and Array

    http://codeforces.com/problemset/problem/299/A 题意 :输入n个数,要求找出一个数能让其他所有的数整除,如果没有的话输出-1.有多个的话输出其中一个. 思 ...

  6. 在NEXUS中加入自己定义的第三方PROXIES代理库

    就是要等会耐心,更新好之后,才能在PUBLIC库里进行操作. 下图是JBOSS的

  7. 在RedHat5.4 LINUX 安装mySQL数据库

    linux下mysql 最新版安装图解教程 1. 查看当前安装的linux版本 通过上图中的数据可以看出安装的版本为RedHat5.4,所以我们需要下载RedHat5.4对应的mysql安装包

  8. CheckBoxList 获取与设置选中的值

    /// <summary> ///CheckBoxListHelper 的摘要说明 ///CheckBoxList获取与设置选中的值 /// </summary> public ...

  9. A9逻辑编译问题

    root@phone-desktop:~# cd '/opt/BARE/01led' root@phone-desktop:/opt/BARE/01led# makearm-linux-gnueabi ...

  10. Area of a Circle

    Area of a Circle Description: Complete the function circleArea so that it will return the area of a ...