時間限制:
2000ms
單點時限:
1000ms
記憶體限制:
256mb
因為方案數可能非常大,大神同學希望知道挑選紀念品的方案數模10^9+7之後的答案。
第一行包括乙個數t,表示資料的組數。
接下來包含t組資料,每組資料一行,包括乙個整數n。
對於每組資料,輸出一行「case x: 」,其中x表示每組資料的編號(從1開始),後接乙個數,表示模10^9+7後的選擇紀念品的方案數。
小資料:
1<=t<=10
1<=n<=100
大資料:
1<=t<=1000
1<=n<=10^18
對於第二組資料,合法的方案有以下幾種,(x,y,z)表示選擇了a類紀念品中價值為x的,b類紀念品中價值為y的,c類紀念品中價值為z的。
(1,1,1): 3*3*3=27種
(1,2,3): 3*2*1=6種
(1,3,2): 3*1*2=6種
(2,1,3): 2*3*1=6種
(2,2,2): 2*2*2=8種
(2,3,1): 2*1*3=6種
(3,1,2): 1*3*2=6種
(3,2,1): 1*2*3=6種
(3,3,3): 1*1*1=1種
一共27+6+6+6+8+6+6+6+1=72種選擇紀念品的方案
注意,如(1,1,2), (2,3,3), (3,1,3)都因為恰好選擇了兩件價值相同的紀念品,所以並不是一種符合要求的紀念品選擇方法。
樣例輸入
213
樣例輸出
case 1: 1case 2: 72
題意:三類紀念品abc,每類都有n種,價值分別為1-n,價值為i的紀念品數量為n-i+1,每類紀念品選乙個,要求不能有恰好兩類紀念品價值相同,求有多少種選法
分析:純數學題,資料比較大,需要在計算時優化。首先,每類紀念品共有sum=(n+1)*n/2個,任選三類紀念品的情況為sum^3,再去掉恰好兩類價值相同的所有情況,即:
sum^3 - 3∑i^2(sum-i),i=1,...,n,i為每類中所選紀念品的個數。
但是n的數量級是10^18,所取模的數量級為10^9,直接遍歷顯然超時,故把公式展開:
sum^3 - 3∑i^2(sum-i) = sum^3 - 3*sum*∑i^2 + 3∑i^3
由於:∑i^2 = n(n+1)(2n+1)/6 = sum*(2n+1)/3,
∑i^3 = [n(n+1)/2]^2 = sum^2
化簡上式:
sum^3 - 3*sum*∑i^2 + 3
∑i^3
= sum^3 - (2n+1)sum^2 + 3sum^2
= sum^3 - 2(n-1)sum^2
優化:1、計算乘法時,用mult(x,y)=mult(x,y/2)*2計算,每步取模
2、計算乘方時,用pow(x,y)=pow(x,y/2)^2遞迴計算,每步取模
**:
#include#include#includeusing namespace std;
long long mod = 1000000007;
long long mmult(long long a, long long b)
else
long long ans = mpow(sum,3);
long long tmp = (n-1+mod)%mod;
tmp = mmult(tmp,mpow(sum,2));
tmp = mmult(tmp,2);
ans = (ans+mod-tmp)%mod;
printf("case %d: %lld\n",cnt,ans);
}}
程式設計之美資格賽
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定2個樹a和b,保證a的節點個數 b的節點個數。現在你需要對樹a的邊進行二染色。乙個好的染色方案,指不存在乙個樹a中的連通塊,同時滿足以下2個條件 1.其中只有同色的邊 2.和b同構。兩個樹同構是指,存在乙個一一對映 既是單射...
程式設計之美2015資格賽
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定兩個日期,計算這兩個日期之間有多少個2月29日 包括起始日期 1.年份能被4整除但不能被100整除 2.年份能被400整除 第一行為乙個整數t,表示資料組數。之後每組資料報含兩行。每一行格式為 month day,year ...
2013程式設計之美資格賽總結
終於可以完成乙個程式比賽的題目了,雖然這次的時間有些長。這是第一次完成,感到真心不錯。廢話不說了,下面說一下這次程式設計之美預選賽的情況。當我在凌晨看到這三個題目時,感覺第乙個還有希望,第二個一點思路沒有,第三個不敢期望。第乙個是詞對變換,感覺不太難。第二道是一種.怎麼說呢,反正是一點思路沒有。第三...