時間限制:
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
樣例輸入
13 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分之...