• 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
    ",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
    ",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
    ",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
    ",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
    ",ans);
    92     }
    93     return 0;
    94 }
  • 相关阅读:
    MongoDB入门
    查看端口通不通
    jQuery通过name获取值
    thinking in java
    xml配置文件解释
    Spring定时器时间设置规则
    修改序列(Sequence)的初始值(START WITH)
    Go语言实现简单的一个静态WEB服务器
    [转载]XML非法字符的处理
    IIS7解决文件上传大小问题
  • 原文地址:https://www.cnblogs.com/BBBob/p/6610727.html
Copyright © 2020-2023  润新知