1 条题解

  • 0
    @ 2025-8-24 21:31:14

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 刘心远
    封神伯纳乌

    搬运于2025-08-24 21:31:14,当前版本为作者最后更新于2017-06-02 19:49:08,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    爆简单数学题!

    【算法分析】设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
    
    • 1

    信息

    ID
    835
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者