zoukankan      html  css  js  c++  java
  • 牛客练习 牛牛的算术(数学、规律)

    题目描述

    输入描述:

    第一行一个正整数  T表示询问次数。

    接下来 T 行 每行一个正整数 n含义如上所述

    输出描述

    T行非负整数 代表答案。

    样例输入

    5
    1
    2
    3
    4
    5

    样例输出

    1
    14
    1050
    73001
    100955

    备注:

    思路

    昨晚写的时候思路有些混乱,现在来整理一下。先写出n=2和n=3的情况观察

    n=2 的情况:(1*1*1)*(2*1*1+2*2*1+2*2*2) = 14

    n=3的情况:(1*1*1)*(2*1*1+2*2*1+2*2*2)*(3*1*1+3*2*1+3*2*2+3*3*1+3*3*2+3*3*3) = 1050

    以n=3来分析。观察每一项可提取出数字i

    即(1*2*3)*(1*1)*(1*1+2*1+2*2)*(1*1+2*1+2*2+3*1+3*2+3*3)

    = n!*(1*1)*(1*1+2*(1+2))*(1*1+2*(1+2)+3(1+2+3))

    =n!*(1*sum[1])*(1*sum[1]+2*sum[2])*(1*sum[1]+2*sum[2]*3*sum[3]);

    由前面n!可得到当数字n>=199999时,取模结果为0。

    sum表示1-n前缀和,观察发现每一项都有取到前一项的一部分,可利用进行递推。

    预处理,算法复杂度o(n)。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long int ll;
    ll ans[200005];
    const int mod=199999;
    int main(){
        ll res=0,sum=0;
        ans[0]=1;
        for(int i=1;i<=200000;i++){
            sum+=i;
            sum%=mod;
            ans[i]=(i*(ans[i-1]*(res+sum*i)%mod)%mod)%mod;
            res=(res+sum*i)%mod;
        }
        int t;string n;
        cin>>t;
        for(int i=0;i<t;i++){
            cin>>n;
            if(n.size()>6){cout<<"0"<<endl;}
            else{
                ll a=0;
                for(int j=0;j<n.size();j++){
                    a=a*10+n[j]-'0';
                }
                cout<<ans[a]<<endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    Trapping Rain Water
    Construct Binary Tree from Preorder and Inorder Traversal
    Flatten Binary Tree to Linked List
    Permutations II
    Unique Paths II
    Path Sum II
    Unique Binary Search Trees II
    evdev module-----uinput.py
    evdev module-----events.py
    evdev module-----device.py
  • 原文地址:https://www.cnblogs.com/mohari/p/13582028.html
Copyright © 2011-2022 走看看