A Boring Question
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 544 Accepted Submission(s): 313
Problem Description
There are an equation.
∑0≤k1,k2,⋯km≤n∏1⩽j<m(kj+1kj)%1000000007=?
We define that (kj+1kj)=kj+1!kj!(kj+1−kj)! . And (kj+1kj)=0 while kj+1<kj .
You have to get the answer for each n and m that given to you.
For example,if n=1 , m=3 ,
When k1=0,k2=0,k3=0,(k2k1)(k3k2)=1 ;
When k1=0,k2=1,k3=0,(k2k1)(k3k2)=0 ;
When k1=1,k2=0,k3=0,(k2k1)(k3k2)=0 ;
When k1=1,k2=1,k3=0,(k2k1)(k3k2)=0 ;
When k1=0,k2=0,k3=1,(k2k1)(k3k2)=1 ;
When k1=0,k2=1,k3=1,(k2k1)(k3k2)=1 ;
When k1=1,k2=0,k3=1,(k2k1)(k3k2)=0 ;
When k1=1,k2=1,k3=1,(k2k1)(k3k2)=1 .
So the answer is 4.
∑0≤k1,k2,⋯km≤n∏1⩽j<m(kj+1kj)%1000000007=?
We define that (kj+1kj)=kj+1!kj!(kj+1−kj)! . And (kj+1kj)=0 while kj+1<kj .
You have to get the answer for each n and m that given to you.
For example,if n=1 , m=3 ,
When k1=0,k2=0,k3=0,(k2k1)(k3k2)=1 ;
When k1=0,k2=1,k3=0,(k2k1)(k3k2)=0 ;
When k1=1,k2=0,k3=0,(k2k1)(k3k2)=0 ;
When k1=1,k2=1,k3=0,(k2k1)(k3k2)=0 ;
When k1=0,k2=0,k3=1,(k2k1)(k3k2)=1 ;
When k1=0,k2=1,k3=1,(k2k1)(k3k2)=1 ;
When k1=1,k2=0,k3=1,(k2k1)(k3k2)=0 ;
When k1=1,k2=1,k3=1,(k2k1)(k3k2)=1 .
So the answer is 4.
Input
The first line of the input contains the only integer
T
,
(1≤T≤10000)
Then T lines follow,the i-th line contains two integers n , m , (0≤n≤109,2≤m≤109)
Then T lines follow,the i-th line contains two integers n , m , (0≤n≤109,2≤m≤109)
Output
For each
n
and
m
,output the answer in a single line.
Sample Input
2 1 2 2 3
Sample Output
3 13
Author
UESTC
Source
Recommend
wange2014
题意……
解题思路
其实比赛的的时候哪有什么思路
本来想生推公式但是发现
除了找到非递降序列才有值这一有用规律就再不能看出什么了
也忘记了交换计算次序
从而变成二项式展开的形式
那就直接打表找规律呗……
ABORINGPROBLEM
正经化简如官方题解所示
1、非递降序列有值
2、交换计算次序,把乘法对应的项提到自己做变元的那个累加号后
3、后面的就是二项式展开反着用往前推即可
例如最后一个式子那里sigma(2^k2*C(k3,k2))=(1+2)^k3
4、注意最后一次化简到的式子不能用二项式定理了,是一个等比数列求和
5、化成公式,费马小处理逆元,问题完美得解
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
const int MO=1e9+7;
typedef long long LL;
LL qm(LL a,LL b)
{
LL ans=0;
while(b)
{
if(b&1)
ans=(ans+a)%MO;
a=(a+a)%MO;
b>>=1;
}
return ans;
}
LL qp(LL a,LL n)
{
LL ans=1;
while(n)
{
if(n&1)
ans=(ans*a)%MO;
a=(a*a)%MO;
n>>=1;
}
return ans;
}
int main()
{
int t;
int m,n;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
printf("%I64d\n",(qp(m,n+1)-1+MO)%MO*qp(m-1,MO-2)%MO);
}
return 0;
}