HDU 5878 I Count Two Three

打表,二分。

满足条件的数字个数不多,可以全部找出来,排个序,每次询问的时候二分一下。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-6;
void File()
{
    freopen("D:\\in.txt","r",stdin);
    freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
    char c=getchar(); x=0;
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) {x=x*10+c-‘0‘; c=getchar();}
}

const int maxn=100010;
LL M=2e9;
LL p[maxn];
int sz=0;

int main()
{
    LL a=1;
    for(int i=0;;i++)
    {
        if(i!=0) a=a*2; if(a>M) break;
        LL b=1;
        for(int j=0;;j++)
        {
            if(j!=0) b=b*3; if(b>M||a*b>M) break;
            LL c=1;
            for(int s=0;;s++)
            {
                if(s!=0) c=c*5; if(c>M||a*b*c>M) break;
                LL d=1;
                for(int k=0;;k++)
                {
                    if(k!=0) d=d*7; if(d>M||a*b*c*d>M) break;
                    p[sz++]=a*b*c*d;
                }
            }
        }
    }

    sort(p,p+sz);
    int T; scanf("%d",&T);
    while(T--)
    {
        LL n; scanf("%lld",&n);
        int L=0,R=sz-1,pos;
        while(L<=R)
        {
            int m=(L+R)/2;
            if(p[m]<n) L=m+1;
            else if(p[m]==n) { pos=m; break; }
            else pos=m,R=m-1;
        }
        printf("%lld\n",p[pos]);
    }
    return 0;
}
时间: 2024-10-19 10:01:16

HDU 5878 I Count Two Three的相关文章

hdu 5878 I Count Two Three (2016 ACM/ICPC Asia Regional Qingdao Online 1001)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5878 题目大意: 给出一个数n ,求一个数X, X>=n. X 满足一个条件 X= 2^a*3^b*5^c*7^d 求靠近n的X值. 解题思路: 打表+二分查找 [切记用 cin cout,都是泪...] AC Code: 1 #include<bits/stdc++.h> 2 using namespace std; 3 long long na[100002]; 4 5 int main

HDU 5878 I Count Two Three (打表+二分查找) -2016 ICPC 青岛赛区网络赛

题目链接 题意:给定一个数n,求大于n的第一个只包含2357四个因子的数(但是不能不包含其中任意一种),求这个数. 题解:打表+二分即可. #include <iostream> #include <math.h> #include <stdio.h> #include<algorithm> using namespace std; long long data[1000000],tot=0; int main() { long long maxn = 10

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6155 Subsequence Count 矩阵快速幂

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6155 题意: 题解来自:http://www.cnblogs.com/iRedBean/p/7398272.html 先考虑dp求01串的不同子序列的个数. dp[i][j]表示用前i个字符组成的以j为结尾的01串个数. 如果第i个字符为0,则dp[i][0] = dp[i-1][1] + dp[i-1][0] + 1,dp[i][1] = dp[i-1][1] 如果第i个字符为1,则dp[i][1

HDU 5056 Boring count(数学)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5056 Problem Description You are given a string S consisting of lowercase letters, and your task is counting the number of substring that the number of each lowercase letter in the substring is no more t

hdu 5056 Boring count

http://acm.hdu.edu.cn/showproblem.php?pid=5056 题意:给你一个字符串,然后找出子串中每一个字母出现次数小于等于k的个数. 思路:枚举字符串下标i,每次计算以i为结尾的符合条件的最长串.那么以i为结尾的符合条件子串个数就是最长串的长度.求和即可. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 100010 5 #de

HDU 6155 Subsequence Count 线段树维护矩阵

Subsequence Count Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others) Problem Description Given a binary string S[1,...,N] (i.e. a sequence of 0's and 1's), and Q queries on the string. There are two types of querie

HDU 5056 Boring count(窗口滑动法)

题目地址:HDU 5056 我晕啊..当时绝壁脑残了...当时想到的方法是完全正确的..但是在脑算第二个样例的时候,居然一直把前三个abc当成了9种...于是后面的三个abc每个都要递增2,而不是我想的方法中的递增3...于是一直没写代码... 言归正传.. 这题的思路就是窗口滑动,两个指针,让指针内的始终保持每个字母的数量少于k个.然后递推过去.然后因为每次右指针往右移动一个的时候,就相当于右指针当前指的数可以与左边的每一个之间都形成一个子序列.所以要增加当前窗口的数量. 代码如下: #inc

HDU 5056 Boring Count --统计

题解见官方题解,我这里只实现一下,其实官方题解好像有一点问题诶,比如 while( str[startPos] != str[i+1] ) cnt[str[startPos]]--, startPos++; 那个str[i+1]的话会越界.应该是这样: while(str[startPos] != str[i]) 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cstdl

hdu 6155 -&#160;Subsequence Count

话说这题比赛时候过的好少,连题都没读TOT 先考虑dp求01串的不同子序列的个数. dp[i][j]表示用前i个字符组成的以j为结尾的01串个数. 如果第i个字符为0,则dp[i][0] = dp[i-1][1] + dp[i-1][0] + 1,dp[i][1] = dp[i-1][1] 如果第i个字符为1,则dp[i][1] = dp[i-1][1] + dp[i-1][0] + 1,dp[i][0] = dp[i-1][0] 显然这是线性递推,我们考虑如何用矩阵表示这种递推关系. 下面分别