HDU 4937 (杭电多校 #7 1003题)Lucky Number(瞎搞)

题目地址:HDU 4937

多校的题以后得重视起来。。。每道题都错好多次。。。很考察细节。比如这道。。。。WA了无数次。。。。

这题的思路自己真心想不到。。。这题是将进制后的数分别是1位,2位,3位和更多位的分开来计算。

当是1位的时候,显然只有3到6,此时只能是-1

当是2位的时候,可以转换成一元一次方程求解

当是3位的时候,可以转换成一元二次方程求解

当是4位的时候,此时最多也只有7000个数,7000^3接近1e12。所以剩下的直接枚举进制数来判断即可。

代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
int main()
{
    LL t, n, i, j, flag, a, b, c, ans, k, num=0;
    //freopen("1.txt","r",stdin);
    //freopen("2.txt","w",stdout);
    scanf("%I64d",&t);
    while(t--)
    {
        ans=0;
        num++;
        scanf("%I64d",&n);
        if(n>=3&&n<=6)
        {
            printf("Case #%I64d: -1\n",num);
            continue ;
        }
        for(i=3; i<=6; i++)
        {
            for(j=3; j<=6; j++)
            {
                k=(n-j)/i;
                if(k*i==n-j&&(n-j)/i>max(i,j))
                {
                    ans++;
                    //printf("--%d\n",k);
                }
            }
        }
        for(i=3; i<=6; i++)
        {
            for(j=3; j<=6; j++)
            {
                for(k=3; k<=6; k++)
                {
                    a=i;b=j;c=k-n;
                    LL f=b*b-4*a*c;
                    if(f>0)
                    {
                        LL d=sqrt(f);
                        if(d*d==f)
                        {
                            LL x=(-b+d)/(2*a);
                            if(x>max(max(i,j),k)&&x*2*a==(-b+d))
                            {
                                ans++;
                                //printf("---%d\n",x);
                            }
                        }
                    }
                }
            }
        }
        for(i=2; i<=7000; i++)
        {
            LL c=n, d, x=0;
            flag=0;
            while(c)
            {
                d=c%i;
                c=c/i;
                x++;
                if(d<3||d>6)
                {
                    flag=1;
                    break;
                }
            }
            if(!flag&&x>3)
            {
                ans++;
                //printf("----%d\n",i);
            }
        }
        printf("Case #%I64d: %I64d\n",num,ans);
    }
    return 0;
}

HDU 4937 (杭电多校 #7 1003题)Lucky Number(瞎搞),布布扣,bubuko.com

时间: 2024-10-10 13:45:03

HDU 4937 (杭电多校 #7 1003题)Lucky Number(瞎搞)的相关文章

HDU 4923 (杭电多校 #6 1003题)Room and Moor(公式+栈)

题目地址:HDU 4923 比赛的时候脑残了..思路完全想出来了..只不过想出了个根本不可能存在的极端数据,然后一看输入数据是100组,就把自己给否决了...sad..当时就应该大胆试一试的... 这个题首先可以把最前面的0和最后面的1去掉,因为这两块总可以用0和1抵消掉.然后中间就分成了10相间的情况,然后根据10相间,可以分成若干组,每一组都是由几个1和几个0组成的.比如说1101101110,就可以分成110,110,1110这样的三组. 然后这时候可以可以对每一组内只取一个数来使得这组的

HDU 4975 (杭电多校 #10 1005题)A simple Gaussian elimination problem.(网络流之最大流)

题目地址:HDU 4975 对这题简直无语...本来以为这题要用什么更先进的方法,结果还是老方法,这么卡时间真的好吗....比赛的时候用了判环的方法,一直TLE..后来换了矩阵DP的方式,加了加剪枝就过了..无语了.. 代码如下: #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cstdio> #include <

HDU 4970(杭电多校#9 1011题)Killing Monsters(瞎搞)

题目地址:HDU 4970 先进行预处理,在每个炮塔的火力范围边界标记一个点.然后对每个点的伤害值扫一遍就能算出来.然后在算出每个点到终点的总伤害值,并保存下来,也是扫一遍即可.最后在询问的时候直接判断即可,复杂度O(2*n). 代码如下: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define maxn 110000 #define LL __int6

HDU 4961(杭电多校#9 1002题)Boring Sum(瞎搞)

题目地址:HDU 4961 看来这题的测试数据是随机的.不然出了极限数据还真过不了...这题我的方法是建一个哈希结构体,记录两个变量,分别是num位置,然后是f,f==0表示这个数没出现过,f==1表示这个数出现过.然后分别从前面和后面扫一遍.每次扫的时候,对每一个出现的数都进行标记.然后对当前的数枚举该数的倍数,全部枚举完,取位置num最大的.然后找完之后,对哈希结构体进行更新.如果前面曾经出现过的话,就直接换掉,因为后面的数总比前面的更优.最后扫完两遍之后两个数组就能求出来了.计算就行了.

HDU 4968(杭电多校#9 1009题)Improving the GPA (瞎搞)

题目地址:HDU 4968 这题的做法是全部学科的学分情况枚举,然后推断在这样的情况下是否会符合平均分. 直接暴力枚举就可以. 代码例如以下: #include <cstring> #include <cstdio> #include <math.h> #include <algorithm> using namespace std; int main() { int t, n, a, i, tot, j, k, h, i1, j1, k1, h1, i2,

HDU 4901(杭电多校训练#3 1005题)The Romantic Hero(DP)

题目地址:HDU 4901 这题没想到最后居然能够做出来.... 这题用了两次DP,先从前往后求一次异或的,再从后往前求一次与运算的.分别是 1:求异或的时候,定义二维数组huo[1000][1024],前者指第几位,后者是哈希的思想,若huo[x][y]=2则表示最右边的数为第x位时,异或值为y的出现了两次,需要再定义一个hash数组,来保存前面出现的所有情况,再找有多少位的时候,用hash数组中出现的所有的值与当前的第x位的数字进行异或. 2:求与的时候,定义二维数组yu[1000][102

HDU 4888 (杭电多校#3)Redraw Beautiful Drawings(网络流之最大流)

题目地址:HDU 4888 自己之所以弱真心是态度的问题,以后不能再偷懒了!!那次这个题一直没补,结果这次又遇到了..还有这次遇到的最小割权闭合问题,也一直没刷,所以这次遇到了也不会,连是最小割都不知道!!(突然想起来前面还有好多题拖到现在也没做...T U T)以后绝不能再拖拉了! 这题的建图是很容易的,主要是判断唯一性不好判断.这里是用的dfs找环来判断是否唯一,因为假如有环的话,说明环 中的数字是可以相互流动而且可以保证解依然正确.. 代码如下: #include <cstdio> #i

2015杭电多校(III)改题表

题号 hdu 类型 比赛 分配 最终 1001 5316 线段树 YES    √ 1002 5317 简单题 YES    √ 1003 5318 快速幂 YES    √ 1004 5319 模拟 YES    √ 1005 5320 数论   Z   1006 5321 数论   Z   1007 5322 dp YES    √ 1008 5323 搜索 YES    √ 1009 5324 树套树 NO W  √ 1010 5325 bfs YES    √ 1011 5326 简单题

2015杭电多校(IV)改题表

题号 hdu 类型 比赛 分配 最终 1001 5327   YES   √ 1002 5328   YES   √ 1003 5329     H   1004 5330     W   1005 5331     H   1006 5332     W   1007 5333     H   1008 5334   YES   √ 1009 5335   YES   √ 1010 5336   YES   √ 1011 5337     W   1012 5338   YES   √