2020こんにちはcodeforce

トピックリンク:http://codeforces.com/contest/1284

 

A.New年と命名

デジタルは、残りを取ることができ、S + Tに対応する文字列配列名という名前の、対応する文字列配列を見つけます

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
int型のmain()
{ 
    int型のn、mは、
    ストリング S [ 30 ]、T [ 30 ]。
    CIN >> N >> M。
    以下のためにINT iが= 0 ; N iが<; I ++)CIN >> S [i]は、
    以下のためにINT iが= 0 ; I <M、I ++)CIN >> T [i]は、
    int型Q; 
    cinを >> Q;
    一方、(q-- 
    { 
        int型のy; 
        cinを >> Y; 
        coutの<< S [(Y- 1)%N] << T [(Y- 1)%のM] << ENDL。
    } 
    戻り 0 
}

 

B.New年とアセントシーケンス

グループの数、順序を与えるどのように多くのそれぞれの数は、最初に説明し、その後の数、グループの数N Nの周りに係合させることができるが、積分グループの数N * Nを形成します

I <J及び[I] <[J]の存在下での配列a []は、要件を満たすのであれば、それがどのくらいの全コンプライアンスにグループのn×n個のグループの数を計算します。

アイデア:数字のセットと、自分のスプライシングは、フロント/リアで戦うために誰かすることができます。

それ自体は、昇順が含まれている場合は、関係なく、戦いが要件を満たしていますかの、数のこのタイプの束を入れて、その答えに、各グループの寄与があるため、前と自身のグループの段階の後にかかわらず、N * 2-1でなければなりません。

しかし、繰り返し計算にこの寄与は、(N-CNT)に変更されなければならない* 2-1、ときにi番目オフCNT、セットの数自体が昇順含ま。

サンプルの寄与を計算する繰り返し

入力:
 3 
2  0  2 
2  0  2 
2  0  2 
出力:
9

ASC自体(すなわち、完全下降)が含まれていない場合、記録アレイHの最大値[i]は、Lの最小値[i]は、放電別のパイルの数。

このパイルで、回答数、スタックH [i]の各寄与はLの数よりも多い[I群]です。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 MAXN = 1E5 + 10 int型 S [ 1000050 ]。
INT フラグ[MAXN]、H [MAXN]、L [MAXN]。
ベクトル < 整数 > 高い、低いです。
int型のmain()
{ 
    長い 長い ANS = 0 INT、N、CNT = 0 
    cinを >> N;
    INT iは= 0 ; I <N I ++ 
    { 
        int型LEN。
        CIN >>LEN;
        int型 TMPH = 0、TMPL = 1E6;
        INT J = 0 ; J <lenを、J ++ 
        { 
            scanf関数(" %のD "、&S [J])。
            もし(!J = 0 && S [J]> S [J- 1 ])フラグ[I] = 1 
            TMPH = MAX(TMPH、S [J])。
            TMPL = 分(TMPL、S [J])。
        } 
        もし(!フラグ[I])
        { 
            H [I] = TMPH。
            L [I] =TMPL。
            high.push_back(TMPH)。
            low.push_back(TMPL)。
        } 
    } 
    ソート(high.begin()、high.end())。
    ソート(low.begin()、low.end()); 
    INTサイズ= high.size()。
    以下のためにINT iが= 0 ; I <N I ++ 
    { 
        場合(フラグ[I] == 1)ANS + =((N-CNT)* 2 - 1)、CNT ++ 
        { 
            INT NUM = UPPER_BOUND(high.begin()、high.end()、L [I]) - high.begin()。
            ANS + =、サイズNUM; 
        } 
    }
    coutの << ANS << てendl;
    リターン 0 ; 
}

 

C.New年と順列

全nの配列(N!ケース)を見つけるために、それぞれの場合に、私は次の条件をすべて見つけ、グループjの数が、答えはグループの数であり、すべてのケースで

[I]、[J]に、最小値の最大値MIN = MAX-JIから

暴力列挙答え:1,6,32,180,1116,7728,59904,518400

3から4への列挙は、プッシュルールは、論理的にN = R 3に追加する必要が見つかったが、係数は、直接正規*ことが見出された(N + 1)/ 2の

#include<bits/stdc++.h>
using namespace std;
int jie[250050];
int extgcd(int a,int b,int& x,int& y)
{
    int d=a;
    if(b!=0)
    {
        d=extgcd(b,a%b,y,x);
        y-=(a/b)*x;
    }
    else 
    {
        x=1;
        y=0;
    }
    return d;
}
int mod_inverse(int a,int m)
{
    int x,y;
    extgcd(a,m,x,y);
    return(m+x%m)%m;
}
int main()
{
    int n,m;
    long long r=0;
    cin>>n>>m;
    jie[1]=1;
    for(int i=2;i<=n;i++)
    {
        jie[i]=1ll*jie[i-1]*i%m;
    }
    for(int i=1;i<=n;i++)
    {
        r=(r+1ll*jie[i]*jie[n-i+1]%m)%m;
    }
    
    //*1,*1.5,*2,*2.5,*3,*3.5......
    //2*1=1,4*1.5=6,16*2=32,72*2.5=180
    r=r*(n+1)%m;
    r=r*mod_inverse(2,m)%m;//除以2等于乘上逆元 
    cout<<r<<endl;
    return 0;
} 

 

D. New Year and Conference

考完试再补:)

おすすめ

転載: www.cnblogs.com/myrtle/p/12150790.html