【玲珑杯 1050】【DP】array

传送门: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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值