题意: http://acm.hdu.edu.cn/showproblem.php?pid=5976
首先队友想出了分的越多答案越多.
我们就: 2,3,4,5,6... 多出来的尽量往小了加就行了.
- #define iOS ios_base::sync_with_stdio(0); cin.tie(0);
- #include <cstdio>//sprintf islower isupper
- #include <cstdlib>//malloc exit strcat itoa system("cls")
- #include <iostream>//pair
- #include <fstream>//freopen("C:\\Users\\13606\\Desktop\\ 草稿. txt","r",stdin);
- #include <bitset>
- //#include <map>
- //#include<unordered_map>
- #include <vector>
- #include <stack>
- #include <set>
- #include <string.h>//strstr substr
- #include <string>
- #include <time.h>// srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
- #include <cmath>
- #include <deque>
- #include <queue>//priority_queue<int, vector<int>, greater<int>> q;//Less
- #include <vector>//emplace_back
- //#include <math.h>
- #include <cassert>
- //#include <Windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
- #include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
- using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
- //******************
- int abss(int a);
- int lowbit(int n);
- int Del_bit_1(int n);
- int maxx(int a,int b);
- int minn(int a,int b);
- double fabss(double a);
- void swapp(int &a,int &b);
- clock_t __STRAT,__END;
- double __TOTALTIME;
- void _MS(){__STRAT=clock();}
- void _ME(){__END=clock();__TOTALTIME=(double)(__END-__STRAT)/CLOCKS_PER_SEC;cout<<"Time:"<<__TOTALTIME<<"s"<<endl;}
- //***********************
- #define rint register int
- #define fo(a,b,c) for(rint a=b;a<=c;++a)
- #define fr(a,b,c) for(rint a=b;a>=c;--a)
- #define mem(a,b) memset(a,b,sizeof(a))
- #define pr printf
- #define sc scanf
- #define ls rt<<1
- #define rs rt<<1|1
- typedef vector<int> VI;
- typedef long long ll;
- const double E=2.718281828;
- const double PI=acos(-1.0);
- //const ll INF=(1LL<<60);
- const int inf=(1<<30);
- const double ESP=1e-9;
- const int mod=(int)1e9+7;
- const int N=(int)1e6+10;
- ll a[N],sum[N],up[N];
- int er[17]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536};
- ll qpow(ll a,ll b,ll mod)
- {
- ll ans;
- // a%=mod;
- ans=1;
- while(b!=0)
- {
- if(b&1)
- ans=(ans*a)%mod;
- b/=2;
- a=(a*a)%mod;
- }
- return ans;
- }
- int main()
- {
- sum[1]=2;
- up[1]=2;
- a[1]=2;
- for(int i=2;i<=N-3;++i)
- a[i]=i+1,sum[i]=i+1+sum[i-1],up[i]=up[i-1]*(i+1)%mod;
- ll x;
- int T;
- sc("%d",&T);
- while(T--)
- {
- sc("%lld",&x);
- if(x<=4)
- {
- cout<<x<<endl;
- continue;
- }
- int temp=0;
- for(int i=16;i>=0;--i)
- {
- if(sum[temp+er[i]]<=x)
- temp+=er[i];
- }
- ll out=x%sum[temp];
- if(temp+1-out>=1)
- {
- ll other=up[temp]*qpow(a[out?temp+1-out:temp],mod-2,mod)%mod;
- ll ans=other*(a[out?temp+1-out:temp]+out)%mod;
- pr("%lld\n",ans);
- }
- else
- {
- ll other=up[temp]*qpow(2,mod-2,mod)%mod;
- ll ans=other*(2+out)%mod;
- pr("%lld\n",ans);
- }
- }
- return 0;
- }
- /**************************************************************************************/
- int maxx(int a,int b)
- {
- return a>b?a:b;
- }
- void swapp(int &a,int &b)
- {
- a^=b^=a^=b;
- }
- int lowbit(int n)
- {
- return n&(-n);
- }
- int Del_bit_1(int n)
- {
- return n&(n-1);
- }
- int abss(int a)
- {
- return a>0?a:-a;
- }
- double fabss(double a)
- {
- return a>0?a:-a;
- }
- int minn(int a,int b)
- {
- return a<b?a:b;
- }
来源: http://www.bubuko.com/infodetail-3258967.html