I. 1≤n≤10000,1≤b≤a≤2000
给定 𝑛 组询问,每组询问给定两个整数 𝑎,𝑏,请你输出 的值。
输入格式
第一行包含整数 𝑛。
接下来 𝑛 行,每行包含一组 𝑎 和 𝑏。
输出格式
共 𝑛 行,每行输出一个询问的解。
数据范围
1≤n≤10000,
1≤b≤a≤2000
输入样例:
3
3 1
5 3
2 2
输出样例:
3
10
1
代码:
#include<iostream>
using namespace std;
const int N = 2010,mod = 1e9 + 7;
int n,a,b;
int C[N][N];
void CreateMatrix(){
for(int i = 0;i < N;i ++){
for(int j = 0;j <= i;j ++){
if(j == 0){
C[i][j] = 1;
}else{
C[i][j] = (C[i-1][j-1] + C[i-1][j]) % mod;
}
}
}
}
int main(){
cin>>n;
CreateMatrix();
while(n--){
cin>>a>>b;
cout<<C[a][b]<<endl;
}
return 0;
}
II. 1≤n≤10000,1≤b≤a≤10^5
给定 𝑛 组询问,每组询问给定两个整数 𝑎,𝑏,请你输出 的值。
输入格式
第一行包含整数 𝑛。
接下来 𝑛 行,每行包含一组 𝑎 和 𝑏。
输出格式
共 𝑛 行,每行输出一个询问的解。
数据范围
1≤n≤10000,
1≤b≤a≤
输入样例:
3
3 1
5 3
2 2
输出样例:
3
10
1
代码:
#include<iostream>
using namespace std;
const int N = 100010,mod = 1e9 + 7;
int fact[N],revfact[N];
int n,a,b;
int QuickMOD(int a,int b,int p){
int res = 1;
while(b != 0){
if((b & 1) == 1){
res = (long long) res * a % p;
}
a = (long long) a * a % p;
b /= 2;
}
return res;
}
int main(){
cin>>n;
fact[0] = revfact[0] = 1;
for(int i = 1;i < N;i ++){
fact[i] = (long long) fact[i - 1] * i % mod;
revfact[i] = (long long) revfact[i - 1] * QuickMOD(i, mod - 2, mod) % mod;
}
while(n--){
cin>>a>>b;
cout<<(long long) fact[a] * revfact[b] % mod * revfact[a - b] % mod<<endl;
}
return 0;
}
III. 1≤n≤20,1≤b≤a≤10^18,1≤p≤10^5
给定 𝑛 组询问,每组询问给定三个整数 𝑎,𝑏,𝑝,其中 𝑝 是质数,请你输出 的值。
输入格式
第一行包含整数 𝑛。
接下来 𝑛 行,每行包含一组 𝑎,𝑏,𝑝。
输出格式
共 𝑛 行,每行输出一个询问的解。
数据范围
1≤n≤20,
1≤b≤a≤,
1≤p≤,
输入样例:
3
5 3 7
3 1 5
6 4 13
输出样例:
3
3
2
代码:
#include<iostream>
using namespace std;
int n,p;
long long a,b;
long long QuickMOD(int a,int b,int p){
long long res = 1;
while(b != 0){
if((b & 1) == 1){
res = (long long) res * a % p;
}
a = (long long) a * a % p;
b /= 2;
}
return res;
}
long long C(long long a,long long b,int p){
long long res = 1;
for(int i = 1,j = a;i <= b;i ++,j --){
res = (long long)res * j % p;
res = (long long)res * QuickMOD(i,p-2,p) % p;
}
return res;
}
long long Lucas(long long a,long long b,int p){
if(a < p && b < p){
return C(a,b,p);
}else{
return (long long) Lucas(a%p,b%p,p) * Lucas(a/p,b/p,p) % p;
}
}
int main(){
cin>>n;
while(n--){
cin>>a>>b>>p;
cout<<Lucas(a,b,p)<<endl;
}
return 0;
}
IV. 1≤b≤a≤5000(结果极大)
输入 𝑎,𝑏,求 的值。
注意结果可能很大,需要使用高精度计算。
输入格式
共一行,包含两个整数 𝑎 和 𝑏。
输出格式
共一行,输出 的值。
数据范围
1≤b≤a≤5000
输入样例:
5 3
输出样例:
10
代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 5010;
int a, b, cnt;
int Primes[N], st[N], leave[N];
void GetPrime(int n)
{
for(int i = 2;i <= n;i ++)
{
if(st[i] == 0){
Primes[cnt] = i;
cnt++;
}
for(int j = 0; Primes[j]*i <= n; j++)
{
st[Primes[j] * i] = 1;
if(i % Primes[j] == 0){
break;
}
}
}
}
int GetNum(int x, int p) {
int res = 0;
while (x) {
res += x / p;
x /= p;
}
return res;
}
vector<int> HighMul(vector<int> a, int b) {
vector<int> c;
int temp = 0;
for (unsigned int i = 0; i < a.size(); i++) {
temp += a[i] * b;
c.push_back(temp % 10);
temp /= 10;
}
while (temp) {
c.push_back(temp % 10);
temp /= 10;
}
return c;
}
int main() {
cin >> a >> b;
GetPrime(a);
for (int i = 0; i < cnt; i++) {
int pt = Primes[i];
leave[i] = GetNum(a, pt) - GetNum(b, pt) - GetNum(a - b, pt);
}
vector<int> res;
res.push_back(1);
for (int i = 0; i < cnt; i++) {
for (int j = 0; j < leave[i]; j++) {
res = HighMul(res, Primes[i]);
}
}
for (int i = res.size() - 1; i >= 0; i--) {
cout << res[i];
}
return 0;
}