Advertisement
yicongli

T156T3

Mar 19th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=5007;
  17. const int p=1e9+7;
  18.  
  19. inline int sub(int a,int b){
  20.     return (a-=b)<0?a+p:a;
  21. }
  22.  
  23. inline int add(int a,int b){
  24.     return (a+=b)>=p?a-p:a;
  25. }
  26.  
  27. inline ll qpow(ll a,ll b){
  28.     ll ans=1;
  29.     while(b){
  30.         if(b&1)(ans*=a)%=p;
  31.         (a*=a)%=p;
  32.         b>>=1;
  33.     }
  34.     return ans;
  35. }
  36.  
  37. ll r,Inv;
  38.  
  39. int pre[N];
  40. int suf[N];
  41. int inv[N];
  42. int F[N];
  43.  
  44. inline ll f(ll x,int n){
  45.     if(x<=n)return F[x];
  46.     x%=p;
  47.     pre[0]=1;
  48.     for(int i=1;i<=n;++i){
  49.         pre[i]=(ll)pre[i-1]*sub(x,i)%p;
  50.     }
  51.     suf[n+1]=1;
  52.     for(int i=n;i>=1;--i){
  53.         suf[i]=(ll)suf[i+1]*sub(x,i)%p;
  54.     }
  55.     ll ret=0;
  56.     for(int i=1;i<=n;++i){
  57.         ret+=((i^n)&1?-1:1)*(ll)F[i]*pre[i-1]%p*suf[i+1]%p*inv[i-1]%p*inv[n-i]%p;
  58.     }
  59.     return (ret%p+p)%p;
  60. }
  61.  
  62. inline void work(int n){
  63.     for(int i=1;i<n;++i){
  64.         F[i]=sub(F[i+1],F[i]);
  65.     }
  66. }
  67.  
  68. int solve(ll n,int k){
  69.     if(!n||!k)return 0;
  70.     int ret=sub(f(n%p,k)*qpow(r,(n+1)%(p-1))%p,f(1,k)*r%p);
  71.     work(k);
  72.     return sub(ret,r*solve(n-1,k-1)%p)*Inv%p;
  73. }
  74.  
  75. ll k,n;
  76.  
  77. int main(){
  78.     freopen("sword.in","r",stdin);
  79.     freopen("sword.out","w",stdout);
  80.     inv[1]=1;
  81.     for(int i=2;i<N;++i)inv[i]=(ll)(p-p/i)*inv[p%i]%p;
  82.     inv[0]=1;
  83.     for(int i=1;i<N;++i)inv[i]=(ll)inv[i]*inv[i-1]%p;
  84.     int T;r(T);
  85.     while(T--){
  86.         r(k),r(n),r(r);
  87.         r%=p;
  88.         Inv=qpow((r-1)%p,p-2);
  89.         for(int i=1;i<=k+1;++i){
  90.             F[i]=qpow(i,k);
  91.         }
  92.         printf("%d\n",solve(n,k+1));
  93.     }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement