1050 - array
Time Limit:3s Memory Limit:64MByte
Submissions:474Solved:144
DESCRIPTION
2 array is an array, which looks like:
1,2,4,8,16,32,64......1,2,4,8,16,32,64......
a1=1 | ai+1ai=2a1=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 ≤10T ≤10), which means the number of cases.For each case, two integer
n(1≤n≤105)n(1≤n≤105).The next line contains
nn numbers
ai(1≤ai≤109)ai(1≤ai≤109)
OUTPUT
one line - the number of subsequence which is 2 array.(the answer will
% 109+7% 109+7)
SAMPLE INPUT
2
4
1 2 1 2
4
1 2 4 4
SAMPLE OUTPUT
5
4
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long LL;
using namespace std;
const LL mod = 1e9 + 7;
const int N = 1e5 + 10;
int a[N];
int dp[35];
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
for(int i = 1; i <= n; i++)
for(int j = 0; j <= 30; j++)
{
if(a[i] == (1 << j))
{
if(j)
dp[j] = (dp[j] + dp[j-1]) % mod;
else
dp[j]++;
}
}
LL ans = 0;
for(int i = 0; i <= 30; i++){
ans = (ans + dp[i]) % mod;
}
printf("%lld\n",ans);
}
return 0;
}