给出以下定义:
首项为1,每一项差为1的数列为W-1阶数列
例:1 2 3 4 5 ...
首项为1,每一项差为W-1的数列为W-2阶数列
例:1 3 6 10 15 ...
首项为1,每一项差为W-2的数列为W-3阶数列
例:1 4 10 20 35 ...
以此类推,求W-n阶前m项和对1e9+7取模的结果
共有T次询问,每次询问给定n和m
0<=n,m<=1e6,0<=T<=1e6
挨个推会发现规律,就是杨辉三角,与组合数有关,就可以得到答案为C(n+m,n+1)。
But...
看着令人绝望的数据范围...1e6。
我的代码:
#include <bits/stdc++.h>
#define ll unsigned long long
using namespace std;
const ll mod=1e9+7;
ll fac(ll x) {
ll sum=1;
for(ll i=1;i<=x;i++) {
sum*=i;
if(sum>mod)
sum%=mod;
}
return sum;
}
ll com(ll n,ll m) {
return fac(n)/((fac(m)*fac(n-m))%mod);
}
void solve() {
ll n,m,ans;
scanf("%d%d",&n,&m);
ans=com(n+m,n+1);
printf("%d\n",ans);
}
int main() {
int T;
scanf("%d",&T);
while(T--) solve();
return 0;
}
求正解!!!欢迎来拷打蒟蒻