時間限制:
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
由於題目有分大資料和小資料的。所以分了兩種。
#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 ...