程式設計之美初賽第二場 集合

2021-06-22 04:51:25 字數 1348 閱讀 9450

時間限制:

12000ms

單點時限:

6000ms

記憶體限制:

256mb

統計滿足下列條件的集合對(a, b)的數量:

因為答案可能很大,你只需要求出它除以m的餘數。

第一行乙個整數t (1 ≤ t ≤ 10),表示資料組數。

接下來是t組輸入資料,測試資料之間沒有空行。

每組資料格式如下:

僅一行,2個整數n和m (1 ≤ m ≤ 108)。

對每組資料,先輸出「case x: 」,然後接乙個整數,表示所求的結果。

小資料:1 ≤ n ≤ 20

大資料:1 ≤ n < 212

樣例輸入

1

3 100000000

樣例輸出

case 1: 18

這題最開始想到的方法是位運算,每位代表乙個數,當i&j==0時說明沒有交集,然後進行f函式比較,但是時間消耗還是很多,n=16時就已經滿足不了要求了。。。。後來嘗試使用動態規劃,數學推算出了h(n)=h(n-1)+3^(n-1)+count(n),其中count(n)為取n這個數字時,n與所有的子集組合進行比較,相等的個數。這裡面count(2^k)會為0,這樣再使用迭代,程式執行的會更加快點,但還是卡在n=17上超時了。。這裡是沒有使用openmp多執行緒的情況下,也沒有使用分布式多執行緒來做。在資料結構上使用的是unsigned long long,這已經是c語言能表達的最大位數了,但是對n=2^20時,構成的排列2^n時,已經放不下了。。。這個不知怎麼解決。。。

#include #define long unsigned long long

int f(int n,int total)}}

} printf("case %d: count:%d\n",++num,count);

} return 0;

}

#include #define long unsigned long long

long f(long n,long total)

//a*b=a*2 *b/2

b>>=1;

a<<=1;

if (a>=mod)

a-=mod;

} return ret;

}long mypow(long a, long n,int flag, long mod)

int main(void)

{ unsigned int t=0,num=0,n,m;

long count;

scanf("%d",&t);

getchar();

while(num

程式設計之美初賽第二場

problem a 一邊輸入邊一邊維護殘留網路,然後跑isap。小資料過了,大資料tle。據說可以bfs預處理 層次網路。可以過。view code include include include include using namespace std const int inf 10000000 ...

2014程式設計之美初賽第二場

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 大神同學是乙個熱愛數字的孩子,她無時無刻不在思考生活與數學的聯絡。有一天,她發現其實公曆的設計是有講究的。每4年就會多閏一天,每一百年又會有一年不是閏年,而第四百年又是閏年。這樣,這四百年的週期裡每一年平均有365又400分之9...

2014程式設計之美初賽第二場

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 大神同學是乙個熱愛數字的孩子。她無時無刻不在思考生活與數學的聯絡。有一天,她發現事實上公曆的設計是有講究的。每4年就會多閏一天,每一百年又會有一年不是閏年。而第四百年又是閏年。這樣。這四百年的週期裡每一年平均有365又400分之...