【玲珑杯 1050】【DP】array

来源:互联网 发布:淘宝怎么找卖家电话 编辑:程序博客网 时间:2024/04/26 00:46

传送门:http://www.ifrog.cc/acm/problem/1050

思路:注意到10^9范围内的2的幂次只有30个,所以我们定义dp[30]这样一个dp数组,dp[i]表示以2^i为结尾的满足条件的子序列的个数。枚举每一个数来转移,复杂度O(n)


代码:

#include <iostream>#include <stdio.h> #include <algorithm>#include <string.h>using namespace std;typedef long long ll;const ll mod = 1e9 + 7;int dp[35];int main(){    int T, n;    ll a, ans, sz;    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{                sz = 0;                while(a % 2 == 0){                    a >>= 1;                    sz++;                }                if(a == 1 && dp[sz - 1] != 0)                    dp[sz] = (dp[sz] + dp[sz - 1]) % mod;            }        }        ans = 0;        for(int i = 0 ; i < 32 ; i++)            ans = (ans + dp[i]) % mod;        printf("%lld\n",ans % mod);    }    return 0;}
描述:

1050 - array

Time Limit:3s Memory Limit:64MByte

Submissions:456Solved:135

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(1n105)n(1≤n≤105).The next line contains nn numbers ai(1ai109)ai(1≤ai≤109)
OUTPUT
one line - the number of subsequence which is 2 array.(the answer will% 109+7% 109+7)
SAMPLE INPUT
241 2 1 241 2 4 4
SAMPLE OUTPUT
54
SOLUTION
“玲珑杯”ACM比赛 Round #4


0 0
原创粉丝点击