当前位置: 首页 > news >正文

hihocoder-1546-集合计数

hihocoder-1546-集合计数

#1546 : 集合计数

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一个包含N个整数的集合S={A1, A2, ... AN},以及一个给定的整数K,请计算有多少个S的子集满足其中的最大值与最小值的和小于等于K。

例如对于S={4, 2, 5, 8}以及K=7,满足的条件的子集有以下4个:{2}, {2, 4}, {2, 5}, {2, 4, 5}。

输入

第一行包含两个整数N和K。  

第二行包含N个整数A1, A2, ... AN。

对于30%的数据,1 <= N <= 20  

对于70%的数据,1 <= N <= 1000  

对于100%的数据,1 <= N <= 100000, 0 <= Ai <= 1000000000, 0 <= K <= 2000000000, A1 ~ AN 两两不同。

输出

输出满足条件的子集数目。由于答案可能非常大,你只需要输出答案除以1000000007的余数。

样例输入
4 7  
4 2 5 8
样例输出
4

 

 

总结:

  (1), 详细审题,看清题意!!!! 是集合的最大值 + 最小值 <= K 

  (2), 经过 sort 之后,双端往里面扫。

  假如 刚好到了 num[i] + num[j] <= K , 那么,num[i]一定在集合中,保证这个集合的最小值。所以,剩下的 i + 1, i + 2, ..... j, 是随意在不在这个集合, 则是 2 ^ (j - i) 种集合。 

  (3),注意 fast_mode 的 取模操作, 同时对 ans 和 b 取模,保证结果 % MOD。 

 

 

#include <cstdio> 
#include <cstdlib> 
const int MAXN = 1e5 + 10; 
const int MOD = 1000000007;  
int num[MAXN]; 

int cmp(const void *a, const void *b){
    return (*(int *)a - *(int *)b); 
} 
long long fast_mode(long long a, long long b){
    long long ans = 1; 
    while(b > 0){
        if(b%2 == 1){
            ans = ( ans * a ) % MOD; 
        }
        a = (a*a) % MOD; 
        b /= 2; 
    }
    return ans; 
} 
int main(){

    int n, k;
    long long ans; 
    while(scanf("%d %d", &n, &k) != EOF){
        for(int i=0; i<n; ++i){
            scanf("%d", &num[i]); 
        }
        qsort(num, n, sizeof(num[0]), cmp); 
        ans = 0; 
        int j = n-1; 
        for(int i=0; i<n && 2*num[i] <= k; ++i){
            while(j>=i && num[j] + num[i] > k){
                --j; 
            }
            if(j >= i){
                ans  = (ans + fast_mode(2, j-i)) % MOD; 
            }
        }
        printf("%lld\n", ans );
    }
    return 0; 
}

  

 

转载于:https://www.cnblogs.com/zhang-yd/p/7375249.html

相关文章:

  • JTemplates + $.Ajax
  • 面向对象编程思想-命令模式
  • C#自定义事件模拟风吹草摇摆
  • 仿真反射详解(二)
  • alwayson01-搭建域环境
  • freemark基础知识
  • avaweb(三十二)——JDBC学习入门
  • 希尔排序之C++实现(初级版)
  • 在linux中,如何增加、修改、删除、暂停和冻结用户名
  • 深入理解Java内存模型——volatile
  • js面试中长见的算法题(转载)
  • Mybatis避免出现语法错
  • 94)图片验证码
  • css的存在形式及优先级
  • Java学习3——java介绍
  • 【mysql】环境安装、服务启动、密码设置
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Facebook AccountKit 接入的坑点
  • HashMap ConcurrentHashMap
  • JavaScript 基本功--面试宝典
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • js正则,这点儿就够用了
  • k个最大的数及变种小结
  • magento 货币换算
  • Node项目之评分系统(二)- 数据库设计
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Redux 中间件分析
  • Spring-boot 启动时碰到的错误
  • Vue UI框架库开发介绍
  • 小程序开发中的那些坑
  • 一道闭包题引发的思考
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • "无招胜有招"nbsp;史上最全的互…
  • $GOPATH/go.mod exists but should not goland
  • (1)(1.11) SiK Radio v2(一)
  • (BFS)hdoj2377-Bus Pass
  • (javascript)再说document.body.scrollTop的使用问题
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (论文阅读11/100)Fast R-CNN
  • (七)Java对象在Hibernate持久化层的状态
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)nsfocus-绿盟科技笔试题目
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET 中 GetProcess 相关方法的性能
  • .net对接阿里云CSB服务
  • .NET学习教程二——.net基础定义+VS常用设置
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .NET中GET与SET的用法