HDU5976 Detachment
1 /* 2 HDU5976 Detachment 3 http://acm.hdu.edu.cn/showproblem.php?pid=5976 4 数论 等差数列 5 * 6 * 7 */ 8 #include <cstdio> 9 #include <algorithm> 10 #include <vector> 11 using namespace std; 12 const int mod=1000000007; 13 const int Nmax=50001; 14 vector<long long> v; 15 long long f[Nmax]; 16 long long g[Nmax]; 17 long long qpow(long long base,int n) 18 { 19 long long ans=1LL; 20 base=base%mod; 21 while(n>0) 22 { 23 if(n&1) 24 ans=ans*base%mod; 25 base=(base*base)%mod; 26 n>>=1; 27 } 28 while(ans<0) 29 ans+=mod; 30 return ans; 31 } 32 33 int main() 34 { 35 //freopen("3.in","r",stdin); 36 int t; 37 scanf("%d",&t); 38 long long x; 39 f[1]=1LL; 40 41 f[0]=0LL; 42 f[2]=2LL; 43 g[1]=1LL; 44 g[2]=2LL; 45 v.push_back(f[1]); 46 v.push_back(f[2]); 47 for(int i=3;i<Nmax;i++) 48 { 49 g[i]=1LL*i*g[i-1]%mod; 50 f[i]=1LL*i+f[i-1]; 51 v.push_back(f[i]); 52 } 53 //printf("%lld\n",f[Nmax-1]); 54 while(t--) 55 { 56 long long ans=1LL; 57 scanf("%lld",&x); 58 int j=1; 59 int k=1; 60 for(int i=1;i<Nmax;i++) 61 { 62 if(x>=f[i] && x<f[i+1]) 63 { 64 j=i; 65 break; 66 } 67 } 68 //printf("bj:%d\n",j); 69 j=lower_bound(v.begin(),v.end(),x)-v.begin(); 70 while(!(x>=f[j]&& x<f[j+1])) 71 j++; 72 //printf("j:%d\n",j); 73 long long remain=x-f[j]; 74 if(remain) 75 { 76 if(remain==j) 77 k=2; 78 else 79 k=j+1-remain; 80 //printf("j:%d k:%d\n",j,k); 81 ans=g[j]; 82 ans=ans*qpow(1LL*k, mod-2 )%mod; 83 ans=ans*(k+remain)%mod; 84 } 85 else 86 { 87 ans=g[j]; 88 } 89 while(ans<0) 90 ans+=mod; 91 printf("%lld\n",ans); 92 } 93 return 0; 94 }