2018徐州網路賽

2021-09-27 09:01:43 字數 1176 閱讀 5626

a. hard to prepare (dp)

題目:

題意:環形圈中,給每人乙個號碼,求使得相鄰數字反異或為正數的方案數。

有題意可推出,每兩個數反異或要麼是0要麼是正數,所以也就是讓相鄰數字反異或後不能為0。又知道,與某個數反異或之後為0的只有唯一乙個數,因此可推出第1個人到第n個人分別可選的數的個人為:

因此,粗略的結果即為:

但其中,有個特殊的情況就是,當第1個人和第n-1個人的號碼相同時,第n個人就有2^k-1個數可以選擇。

而在上式中,第n-1個數的「 2^k-1 」是包含了與第1個人相同和不相同兩種情況了的(從另乙個角度可以看成,因為最多也就2^k-1個數可以選擇,所以不可能沒有包含相同的情況)。此時:

讓前面n-2個數的乘積後的結果為y;

情況1:讓第1個數與第n-1個數相同時,第n-1個數可以選擇的數的個數設為x1,即x1=1;

情況2:讓第1個數與第n-1個數不相同時,第n-1個數可以選擇的數的個數設為x2;

所以 x1+x2 = 2^k - 1。

則:情況1時,第n個數可選的數的個數為2^k-1,結果應為:

情況2時,第n個數可選的數的個數為2^k-2,結果應為:

而最終的結果應為res = 情況1+情況2

即:因為由情況1和情況2的描述可知,

所以上式為

上式中,+號前部分其實就是我們一開始得出的粗略res結果啦;而+號後部分,其實可以看做是求前n-2個數的方案了(因為第n-1個數和第1個數相同,就相當於第n-1的數和第1的數這兩個數合併為1個數了,就圍成了n-2個人的環形圈),因此就變成了遞迴n-2個人的方案啦。

所以最後,上**!

#includeusing namespace std;

const int mod=1e9+7;

const int maxn=1e6+10;

#define ll long long

ll two[maxn];

void init()

// if(na==2)

// two[nb]=res;

return res;

}ll solve(int n,int k)

int main()

return 0;

}

徐州網路賽2018

網路賽的題比賽應該不會出了吧 嗯.include using namespace std define ll long long const int maxn 1005 int down,up,s,n int a maxn b maxn c maxn int dp maxn 305 int high...

2018徐州網路賽F,H,I

只能來划水,只做了3題。f 隊友切的 includeusing namespace std int line,k,t,ans,x,y,len int main for auto it mp.begin it mp.end it ans max ans,len cout includeusing na...

2018 徐州網路賽 G 題解

電波 這題首先要倒著貼這樣 每次 就好了 還有就是 資料太大需要離散化 然後建線段樹,根據x軸的座標建座標軸 看 這個點的 max y 有多大 如果 y i max y 產生 貢獻 ans y x max x x軸同理 includeusing namespace std define maxn 1...