1050 - array
Time Limit:3s Memory Limit:64MByte
Submissions:453Solved:134
DESCRIPTION
2 array is an array, which looks like:
1,2,4,8,16,32,64……
a1=1 | ai+1ai=2
Give you a number array, and your mission is to get the number of subsequences ,which is 2 array, of it.
Note: 2 array is a finite array.
INPUT
There are multiple test cases.
The first line is a number T (T ≤10
), which means the number of cases. For each case, two integer n(1≤n≤105). The next line contains n numbers ai(1≤ai≤109)
OUTPUT
one line - the number of subsequence which is 2 array.(the answer will % 109+7
)
SAMPLE INPUT
2
4
1 2 1 2
4
1 2 4 4
SAMPLE OUTPUT
5
4
注意到10^9范围内的2的幂次只有30个,所以我们定义dp[30]这样一个dp数组,dp[i]表示以2i为结尾的满足条件的子序列的个数。枚举每一个数来转移,复杂度O(n)
AC代码 :
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const LL mod = 1e9 + 7;
int dp[35];
int main()
{
int T,N;
LL a,ans,cut;
scanf("%d",&T);
while(T--){
memset(dp,0,sizeof(dp));
scanf("%d",&N);
for(int i = 1 ; i <= N ; i++){
scanf("%lld",&a);
if(a == 1)
dp[0]++;
else{
cut = 0;
while(a % 2 == 0){
a >>= 1;
cut++;
}
if(a == 1 && dp[cut - 1] != 0)
dp[cut] = (dp[cut] + dp[cut - 1]) % mod;
}
}
ans = 0;
for(int i = 0 ; i < 32 ; i++)
ans = (ans + dp[i]) % mod;
printf("%lld\n",ans % mod);
}
return 0;
}