列表

详情


NC20591. [SHOI2015]超能粒子炮

描述

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

输入描述

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

输出描述

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

示例1

输入:

1
5 5

输出:

32

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 259ms, 内存消耗: 73440K, 提交时间: 2019-08-09 11:28:46

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll const mod = 2333;
ll n,k,c[mod+10][mod+10],sum[mod+10][mod+10];
void Init(){
	for(ll i=0;i<=mod;i++){
		sum[i][0] = c[i][0] = 1;
		for(ll j=1;j<=i;j++){
			c[i][j] = (c[i-1][j-1] + c[i-1][j]) % mod;
		}
		for(ll j=1;j<=mod;j++)
			sum[i][j] = (sum[i][j-1] + c[i][j]) % mod;
	}
}
ll Lucas(ll n,ll m){
	if(n < m)	return 0;
	else if(m == 0)	return 1;
	else return c[n % mod][m % mod] * Lucas(n / mod,m / mod) % mod;
}
ll fun(ll n,ll k){
	if(k < 0)	return 0;
	if(n == 0)	return 1;
	return (sum[n % mod][mod - 1] * fun(n / mod,k / mod - 1) % mod + Lucas(n / mod,k / mod) * sum[n % mod][k % mod] % mod) % mod;
}
int main(){
	int T;
	Init();
	scanf("%d",&T);
	while(T--){
		scanf("%lld%lld",&n,&k);
		printf("%lld\n",fun(n,k));
	}
	return 0;
}

C++(clang++11) 解法, 执行用时: 180ms, 内存消耗: 73276K, 提交时间: 2020-11-01 09:21:17

#include<cstdio> 
#define ll long long
#define rep(i,x,y) for(ll i=x;i<=y;i++)
using namespace std; 
const ll maxn=2335,p=2333; 
ll c[maxn+2][maxn+2],f[maxn+2][maxn+2],T; 
inline ll lucas(ll n,ll m){
	if (m==0||n==m) return 1; 
	if (n<m) return 0; 
	return lucas(n/p,m/p)*c[n%p][m%p]%p; 
}
inline ll F(ll n,ll k){
	if (!n||!k) return 1; 
	if (k<0) return 0; 
	if (n<p&&k<p) return f[n][k]; 
    return (F(n/p,k/p-1)*f[n%p][p-1]%p+lucas(n/p,k/p)*f[n%p][k%p])%p; 
}
int main(){
	scanf("%lld",&T);
	c[0][0]=f[0][0]=1;  ll n,k; 
	rep(i,1,maxn) c[i][i]=c[i][0]=1; 
	rep(i,1,maxn) f[i][0]=1;
	rep(i,1,maxn) rep(j,1,i-1) c[i][j]=(c[i-1][j]+c[i-1][j-1])%p; 
	rep(i,0,maxn) rep(j,1,maxn) f[i][j]=(c[i][j]+f[i][j-1])%p;
	while (T--){
		scanf("%lld%lld",&n,&k); 
		printf("%lld\n",F(n,k)); 
	}
}

上一题