トピックへのリンク:https://www.luogu.org/problemnew/show/P1494
オフラインチームのMo
[L、R]区間内:
次のようにそれぞれの靴下の数があると仮定します。
答えは次のとおりです。
単純化は次のとおりです。
だから我々は尋ねる:することができます
#include <iostreamの> する#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <地図> の#include < セット > の#include <ベクトル> の#include < ストリング > の#include <cmath> の#define担当者(I 、S、E)がため(I = Sをint型、iは、Eを<; ++ I) の#define P対<整数、整数> の#define INF 0x3f3f3f3f 使用 名前空間STD。 typedefの長い 長いLL。 静的 のconst int型 MAX_N = 5E4 + 5 。 静的 CONST LLモッド= 1E9 + 7 。 構造体クエリー{ int型のL、R、ID、POS。 ブール 演算子 <(クエリ&Q)のconst { 場合(POS == q.pos)戻り R < QR。 リターン POS < q.pos。 } } Q [MAX_N]。 構造体回答{ LLのREV1、REV2。 } [MAX_N] revは。 INT CNT [MAX_N]、[MAX_N]。 LLのGCD(LLのX、LLのY){ リターンのy == 0?X:GCD(Y、Xの%のY)。 } ANS LL; // このカードはロングロングになり ボイドアップデート(int型 P、int型V){ 年 - CNT = [[P]] * CNT [[P]]; CNT [[P]] + = V。 年 + CNT = [[P]] * CNT [[P]]; } ボイド)(解決{ int型N、M。 scanf関数(" %d個の%のD "、&N、&M)。 INTのブロック=(INT )SQRT(N) 以下のために(int型 I = 1(のscanf ++ I; iは= N <)" は%d "、&[I])。 以下のために(int型 = Iを1 ; I <= M; ++ I){ scanf関数(" %d個の%のD "、&Q [i]は.L&Q [I] .R)。 Q [i]は.ID = iは、 Q [i]は.POS =(Q [i]が.L - 1)/ブロック+ 1 。 } ソート(Q + 1、Q + M + 1 )。 int型、L = 1、R = 0 。 以下のために(int型 I = 1 ; I <= M; ++ I){ 場合(Q [i]が.L == Q [I] .R){ REV [Q [i]は.ID] .rev1 = 0 。 REV [Q [i]は.ID] .rev2 = 1 。 続け; } 一方、(L <Q [i]が.L)更新(L ++、 - 1 )。 一方、(L> Q [i]は.L)アップデート( - L、1 )。 一方、(R <Q [i]は.R)更新(++ R、1 )。 一方、(R> Q [i]は.R)更新(r--の、 - 1 )。 INTル= Q [i]は.R - Q [i]が.L + 1 。 REV [Q [i]は.ID] .rev1 =年- 。 REV [Q [i]は.ID] .rev2 =(LL)ル*(ル- 1 )。 LL GC = GCD(REV [Q [i]は.ID] .rev1、REV [Q [i]は.ID] .rev2)。 REV [Q [i]は.ID] .rev1 / = GC。 REV [Q [i]は.ID] .rev2 / = GC。 } 以下のために(int型 I = 1(のprintf ++ I; I <= M)" %LLD /%LLD \ n " [I] .rev2、REV [I] .rev1、REV)。 } INT メイン(){ // freopenは( "INPUT.TXT"、 "R"、STDIN)。 // freopenは( "output.txtと"、 "W"、STDOUT); 解決する(); リターン 0 ; }