azerah.in / azerah.out
Por Costel the Pig has received a royal invitation to the palace of the Egg-Emperor of Programming, Azerah. Azerah had heard of the renowned pig and wanted to see him with his own eyes. Por Costel, having arrived at the palace, tells the Egg-Emperor that he looks "tasty". Azerah feels insulted (even though Por Costel meant it as a compliment) and, infuratied all the way to his yolk, threatens to kill our round friend if he doesn‘t get the answer to a counting problem that he‘s been struggling with for a while
Given an array of numbers, how many non-empty subsequences of this array have the sum of their numbers even ? Calculate this value mod (Azerah won‘t tell the difference anyway)
Help Por Costel get out of this mischief!
Input
The file azerah.in will contain on its first line an integer , the number of test cases. Each test has the following format: the first line contains an integer
(the size of the array) and the second line will contain
integers
(
), separated by single spaces.
It is guaranteed that the sum of over all test cases is at most
Output
The file azerah.out should contain lines. The
-th line should contain a single integer, the answer to the
-th test case.
Example
2
3
3 10 1
2
4 2
3
3
给你一个序列,问你有多少个子序列的元素和为偶数。
水dp。分别记f(i)为前i位元素和为偶数的子序列数,g(i)为前i位元素和为奇数的子序列数。瞎几把转移一下就行了。
#include<cstdio> #include<cstring> using namespace std; typedef long long ll; #define MOD 1000000007ll int T,a[1000010],n; ll f[1000010],g[1000010]; int main() { // freopen("a.in","r",stdin); freopen("azerah.in","r",stdin); freopen("azerah.out","w",stdout); scanf("%d",&T); for(;T;--T) { memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); if(a[1]%2) g[1]=1; else f[1]=1; for(int i=2;i<=n;++i) if(a[i]%2) { f[i]=(g[i-1]+f[i-1])%MOD; g[i]=((f[i-1]+g[i-1])%MOD+1ll)%MOD; } else { f[i]=((f[i-1]*2ll)%MOD+1ll)%MOD; g[i]=(g[i-1]*2ll)%MOD; } printf("%d\n",f[n]); } return 0; }
【动态规划】Gym - 100923A - Por Costel and Azerah
原文:http://www.cnblogs.com/autsky-jadek/p/6321740.html