トピックリンク:http://codeforces.com/contest/1284
デジタルは、残りを取ることができ、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 。 }
グループの数、順序を与えるどのように多くのそれぞれの数は、最初に説明し、その後の数、グループの数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 ; }
全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; }
考完试再补:)