2014程式設計之美資格賽之2 大神與三位小夥伴

2021-06-21 12:51:05 字數 2951 閱讀 6833

時間限制:

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)都因為恰好選擇了兩件價值相同的紀念品,所以並不是一種符合要求的紀念品選擇方法。

樣例輸入

2

13

樣例輸出

case 1: 1

case 2: 72

由於題目有分大資料和小資料的。所以分了兩種。
#include #include using namespace std;

#define mod 1000000007

int main()

for(int i=1;i<=n;i++)}}

printf("case %d: %lld\n",k,s);

}return 0;

}

分析一下題目。

例子:

s(3)=1*1*1 + 1*2*3 + 1*3*2 + 2*1*3 + 2*2*2 + 2*3*1 + 3*1*2 + 3*2*1 + 3*3*3

= 1*1*1 + 2*2*2 + 3*3*3 + 6*(1*2*3)

= [1*1*1 + 2*2*2 + 3*3*3 + 6*(1*2*3) + 3*(1*1*2) + 3*(1*1*3) + 3(1*2*2) + 3*(1*3*3) + 3*(2*2*3) + 3*(2*3*3)] 

- [3*(1*1*2) + 3*(1*1*3) + 3(1*2*2) + 3*(1*3*3) + 3*(2*2*3)+3*(2*3*3)]  (補回恰有兩個相同的情況,然後在外面減回去)

= (1+2+3)^3 - 3*[1*1*2 + 1*1*3 + 1*2*2 + 1*3*3 + 2*2*3 + 2*3*3]((a+b+c)^3=a^3+b^3+c^3+3a^2b+3ab^2+3a^2c+3ac^2+3b^2c+3bc^2+6abc)

= (1+2+3)^3 - 3*[1*1*2 + 1*1*3 + 1*2*2 + 1*3*3 + 2*2*3 + 2*3*3 + ] + 3*(1*1*1+2*2*2+3*3*3)      (補3個(1*1*1+...+n*n*n),再減,方便計算)

= (1+2+3)^3 - 3*[(1*1*1 + 1*1*2 + 1*1*3) + (2*2*1 + 2*2*2 + 2*2*3) + (3*3*1 + 3*3*2 + 3*3*3)] + 3*(1*1*1+2*2*2+3*3*3)

= (1+2+3)^3 - 3*(1+2+3)*(1*1+2*2+3*3) + 3*(1*1*1+2*2*2+3*3*3)

所以

s(n)=(1+2+...+n)^3 + 3*(1+2+...+n)*(1^2+2^2+...+n^2) + 3*(1^3+2^3+...+n^3)

=(n*(n+1)/2)^3 + 3*(n*(n+1)/2)*(n*(n+1)*(2*n+1))/6 + 3*(n*(n+1)/2)^2

=(n*(n+1)/2)^3 + [(n*(n+1)/2)^2]*(2*n+1) + 3*(n*(n+1)/2)^2

=s1^3 + [s1^2]*(2*n+1) + 3*s1^2   (其中s1=n*(n+1)/2)

具體實現:

題目要求把s(n)要模1000000007

模運算與基本四則運算有些相似,但是除法例外。其規則如下:

(a + b) % p = (a % p + b % p) % p (1)

(a - b) % p = (a % p - b % p) % p (2)

(a * b) % p = (a % p * b % p) % p (3)

a ^ b % p = ((a % p)^b) % p (4)

其中這道題中涉及到除法,可以考慮一下逆元,但是整道題除法只有一次除2,所以加個模2判斷(如下)處理一下就可以了。

#include #include using namespace std;

#define mod 1000000007

int main()

return 0;

}

程式設計之美2014 資格賽 題目2 大神與三位小夥伴

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 因為方案數可能非常大,大神同學希望知道挑選紀念品的方案數模10 9 7之後的答案。第一行包括乙個數t,表示資料的組數。接下來包含t組資料,每組資料一行,包括乙個整數n。對於每組資料,輸出一行 case x 其中x表示每組資料的編...

程式設計之美資格賽

時間限制 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 ...