题解 P1866 【编号】

· · 题解

爆简单数学题!

【算法分析】设n=10,10个数分别为12,11,64,65,68,34,36,54,39,48

则先把这10个数升序排列=>11,12,34,36,39,48,54,64,65,68

第一个号码有11种选择,1~11 第二个号码有12-1=11(种)选择(去掉1种)

第三个号码有34-2=32(种)选择(去掉2种)

第四个号码有36-3=33(种)选择(去掉3种)

第五个号码有39-4=35(种)选择(去掉4种)

第六个号码有48-5=43(种)选择(去掉5种)

第七个号码有54-6=48(种)选择(去掉6种)

第八个号码有64-7=57(种)选择(去掉7种)

第九个号码有65-8=57(种)选择(去掉8种)

第十个号码有68-9=59(种)选择(去掉9种)

所以答案为11*11*32*33*35*43*48*57*57*59%1000000007

【温馨提示】1.必须排序,否则前一个选择的号码不知道是否在现在的范围中

2.必须边乘边模,否则long long要爆掉的

【华丽标程】

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,i,maxnumber[51]; long long ans=1; cin>>n;
    for(i=1;i<=n;i++)cin>>maxnumber[i];
    sort(maxnumber+1,maxnumber+n+1);  //排序,默认升序
    for(i=1;i<=n;i++){ans*=(maxnumber[i]-i+1); ans%=1000000007;}  //第i个号码的种数是maxnumber[i]-i+1
    cout<<ans<<endl; return 0;
}
请关注http://blog.sina.com.cn/s/blog_1754bd7130102wxk7.html