P2415 集合求和(一道洛谷好题鸭)(虽然可以水过,但有必研究DP)
此題坑點:
-
結(jié)果必須要用long long存,int存不下
-
如果想要像cout<<sum*pow(2,num-1)這樣在輸出時計算會錯:
long long在計算過程被隱式轉(zhuǎn)換成了double,需要用強制類型轉(zhuǎn)換轉(zhuǎn)換回long long輸出。 -
集合論和排列組合公式初中還沒學(xué)
題目描述
給定一個集合s(集合元素數(shù)量<=30),求出此集合所有子集元素之和。
分析
我們來看一個例子:?\{1,2,3\}{1,2,3}
可以得到,它的所有非空子集為?\{1,2,3\}{1,2,3}?\{1,2\}{1,2}\{2,3\}{2,3}?\{1,3\}{1,3}?\{1\}{1}?\{2\}{2}?\{3\}{3}
現(xiàn)在來分析每一個元素在每一個子集中出現(xiàn)的個數(shù):
11出現(xiàn)了44次,22出現(xiàn)了44次,33出現(xiàn)了44次
我們猜測:對于一個有限集合AA,它的每一個元素在AA的所有子集中出現(xiàn)的個數(shù)是{2^{\operatorname{card}(A)-1}}2card(A)?1
證明:(集合論純自學(xué),可能格式有誤, 請別在意QAQ)
設(shè)B\subseteq AB?A, 記n=\operatorname{card}(A)n=card(A),?ss為AA中所有元素之和
當\operatorname{card}(B)=1card(B)=1時,顯然,每個元素在BB中出現(xiàn)11次;
當\operatorname{card}(B)=2card(B)=2時,保證一個元素必選,在剩余的n-1n?1個元素中選擇11個元素,共C^1_{n-1}=n-1Cn?11?=n?1種情況,故每個元素在BB中出現(xiàn)C^1_{n-1}=n-1Cn?11?=n?1次;
當\operatorname{card}(B)=3card(B)=3時,保證一個元素必選,在剩余的n-1n?1個元素中選擇22個元素,共C^2_{n-1}=\frac{(n-1)!}{2(n-1-2)!}=\frac{(n-1)(n-2)}{2}Cn?12?=2(n?1?2)!(n?1)!?=2(n?1)(n?2)?種情況,故每個元素在BB中出現(xiàn)共C^2_{n-1}=\frac{(n-1)(n-2)}{2}Cn?12?=2(n?1)(n?2)?次;
當\operatorname{card}(B)=kcard(B)=k時,保證一個元素必選,在剩余的n-1n?1個元素中選擇k-1k?1個元素,共C^{k-1}_{n-1}Cn?1k?1?種情況,故每個元素在BB中出現(xiàn)共C^{k-1}_{n-1}Cn?1k?1?次;
那么,每個元素在AA的每一個子集中出現(xiàn)的個數(shù)為:?\sum\limits_{i=1}^{n}C^{i-1}_{n-1}=2^{n-1}i=1∑n?Cn?1i?1?=2n?1?①
AA的所有子集元素之和為s\times2^{n-1}s×2n?1
故代碼如下:
#include<bits/stdc++.h> using namespace std; int main(){long long tmp,num=0,sum=0;while(cin>>tmp){sum+=tmp;num++; }//讀入集合元素個數(shù)num和元素和sumcout<<(long long)(sum*pow(2,num-1)); //必須顯式地轉(zhuǎn)換為long long輸出 }?
①:?不懂為什么\sum\limits_{i=1}^{n}C^{i-1}_{n-1}=2^{n-1}i=1∑n?Cn?1i?1?=2n?1的可以看一下數(shù)學(xué)歸納法證明:
將用到的性質(zhì)公式:
- C^m_n=C^{m-1}_{n-1}+C^{m}_{n-1}Cnm?=Cn?1m?1?+Cn?1m?
- C^n_n=C^0_n=1Cnn?=Cn0?=1
\sum\limits_{i=0}^{n}C^{i}_{n}=2^{n}i=0∑n?Cni?=2n
證明:
1)當n=1n=1時:
\sum\limits_{i=0}^{n}C^{i}_{n}=C^0_1+C^1_1=2=2^1i=0∑n?Cni?=C10?+C11?=2=21
等式成立。
2)假設(shè)當n=k(k\in N_+)n=k(k∈N+?)時\sum\limits_{i=0}^{n}C^{i}_{n}=2^{n}i=0∑n?Cni?=2n?成立, 即\sum\limits_{i=0}^{k}C^{i}_{k}=2^{k}i=0∑k?Cki?=2k
那么當n=k+1n=k+1時:
\text{\ \ \ \ }?????\sum\limits_{i=0}^{k+1}C^{i}_{k+1}i=0∑k+1?Ck+1i?
=C^{0}_{k+1}+C^{1}_{k+1}+C^{2}_{k+1}+...+C^{k}_{k+1}+C^{k+1}_{k+1}=Ck+10?+Ck+11?+Ck+12?+...+Ck+1k?+Ck+1k+1?
=C^{0}_{k+1}+(C^{0}_{k}+C^{1}_{k})+(C^{1}_{k}+C^{2}_{k})+...+(C^{k-1}_{k}+C^{k}_{k})+C^{k+1}_{k+1}=Ck+10?+(Ck0?+Ck1?)+(Ck1?+Ck2?)+...+(Ckk?1?+Ckk?)+Ck+1k+1?
=C^{0}_{k}+(C^{0}_{k}+C^{1}_{k})+(C^{1}_{k}+C^{2}_{k})+...+(C^{k-1}_{k}+C^{k}_{k})+C^{k}_{k}=Ck0?+(Ck0?+Ck1?)+(Ck1?+Ck2?)+...+(Ckk?1?+Ckk?)+Ckk?
=2(C^0_k+C^1_k+C^2_k+...+C^k_k)=2(Ck0?+Ck1?+Ck2?+...+Ckk?)
=2\sum\limits_{i=0}^{k}C^{i}_{k}=2i=0∑k?Cki?
=2\times2^k=2×2k
=2^{k+1}=2k+1
此時等式依然成立。假設(shè)成立。
故\sum\limits_{i=0}^{n}C^{i}_{n}=2^{n}i=0∑n?Cni?=2n
由此可以得到,\sum\limits_{i=1}^{n}C^{i-1}_{n-1}=2^{n-1}i=1∑n?Cn?1i?1?=2n?1
轉(zhuǎn)載于:https://www.cnblogs.com/crazily/p/10352647.html
總結(jié)
以上是生活随笔為你收集整理的P2415 集合求和(一道洛谷好题鸭)(虽然可以水过,但有必研究DP)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机图形学 学习笔记 图元的属性
- 下一篇: 重磅 !程序猿月薪7万可以落户北京!