幸运数的各位和[Codeforces-109A]

Codeforces Beta Round #84 (Div. 1 Only)  时间限制2000ms,内存限制256MB

问题大意:定义幸运数为十进制表示只包含4、7两个数码的数。例如47、744、4都是幸运数,而5、17、467不是。

已知一个幸运数的各位之和,求满足条件的幸运数的最小值。输入保证$1≤n≤10^6$。

这题用暴力方法就可以做。需要注意题目中的几个信息:

1)输入可能达到$10^6$,因此原数必然超过$10^6÷9>10^5$,因此无论用32位还是64位整数是不可能表示的下的。答案必然用字符串的形式来保存和输出。

2)各个数位和为$n$,而各个数位的取值集合为$A_i∈{\{4,7\}}$,只要转化为求解$4x+7y=n$的不定方程即可。

3)上述方程的解$x,y$可能有很多组,问题要求输出由$x$个4和$y$个7构成的十进制数的最小数,必然满足①数字位数最小,也就是$x+y$最小;②相同位数小数字4在高位,即先输出4,而后输出7。

明确了这几点以后,用两层循环穷举可能的$x$,$y$的值就可以了。

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int sum;
 6     cin >> sum;
 7     bool isok = false;
 8     int x, y, t;
 9     for (x = 0; x * 4 <= sum; x++)
10     {
11         for (y = sum / 7; y >= 0; y--)
12         {
13             t = x * 4 + y * 7;
14             if (t == sum)
15             {
16                 isok = true;
17                 goto END;
18             }
19         }
20     }
21     END:
22     if (isok)
23     {
24         while (x--)
25             putchar(‘4‘);
26         while (y--)
27             putchar(‘7‘);
28     }
29     else
30         printf("-1");
31     return 0;
32 }
时间: 2024-12-15 05:33:55

幸运数的各位和[Codeforces-109A]的相关文章

【蓝桥杯】历届试题 幸运数

  历届试题 幸运数   时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的“筛法”生成. 首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第一个幸运数. 我们从2这个数开始.把所有序号能被2整除的项删除,变为: 1 _ 3 _ 5 _ 7 _ 9 .... 把它们缩紧,重新记序,为: 1 3 5 7 9 .... .这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去.注意,是序号位置,不是那个数本身能否

蓝桥杯 - 幸运数 (打表)

历届试题 幸运数 时间限制:1.0s   内存限制:256.0MB 问题描述 幸运数是波兰数学家乌拉姆命名的.它采用与生成素数类似的"筛法"生成 . 首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第一个幸运数. 我们从2这个数开始.把所有序号能被2整除的项删除,变为: 1 _ 3 _ 5 _ 7 _ 9 .... 把它们缩紧,重新记序,为: 1 3 5 7 9 .... .这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去.注意,是序号位置,不是那个数本身

51nod 1230:幸运数

51nod 1230:幸运数 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1230 题目大意:如果一个数各个数位上的数字之和是质数,并且各个数位上的数字的平方和也是质数,则称它为幸运数.例如:120是幸运数,因为120的数字之和为3,平方和为5,均为质数,所以120是一个幸运数字.给定x,y,求x,y之间( 包含x,y,即闭区间[x,y])有多少个幸运数. 数位DP 代码如下: 1 #include <cs

[51NOD1230]幸运数(数位DP)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1230 dp(l,s,ss)表示长度为l的数各位和为s,各位平方和为ss的幸运数的个数. 1 #include <bits/stdc++.h> 2 #pragma comment(linker, "/STACK:10240000,10240000") 3 using namespace std; 4 5 typedef long long

曦皓的幸运数

[题目描述] 仅包含4或7的数被称为幸运数. 一个序列的子序列被定义为从序列中删去若干个数,剩下的数组成的新序列.两个子序列被定义为不同的当且仅当其中的元素在原始序列中的下标的集合不相等.对于一个长度为N的序列,共有2^N个不同的子序列(包含一个空序列). 一个子序列被称为不幸运的,当且仅当其中不包含两个相同的幸运数. 对于一个给定序列,求其中长度恰好为K的不幸运子序列的个数,答案 mod (10^9+7)输出. [输入描述] 第一行两个正整数N.K,表示原始序列的长度和题目中的K: 接下来一行

京东笔试之幸运数问题:4,7

题目描述 4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字. 前几个幸运数字为:4,7,44,47,74,77,444,447... 现在输入一个数字K,输出第K个幸运数. 输入 第一行一个数字T(T<=1000)表示测试数据的组数.对于每组测试数据,输出一个数K 输出 每组数据输出一行,第K个幸运数. 样例输入 351001000000000 样例输出 74744747 77477744774747744747444444447 思路 首先把4和7化为0

幸运数

文字描述:将队列法所描述得序列拿来比较会发现一个规律,如下:初始序列: 4 , 7 4,7 得序列2: 44 , 47 , 74 , 77 得序列3: 444 , 447 , 474 , 477 , 744 , 747 , 774 , 777 规律:每个序列是包含当前位数得所有幸运数,而且相较前一个序列是以2的倍数递增,每个序列得前一半以 4 开头,后一半是以 7 开头,当把头位去掉以后,剩下得幸运数正好是上一个序列,例如序列3包含所有位数为 3 3 得幸运数,而且前 4 个幸运数是以 4 开头

51nod 1230 幸运数

题目大意 如果一个数各个数位上的数字之和是质数,并且各个数位上的数字的平方和也是质数,则称它为幸运数. 例如:120是幸运数,因为120的数字之和为3,平方和为5,均为质数,所以120是一个幸运数字. 给定x,y,求x,y之间( 包含x,y,即闭区间[x,y])有多少个幸运数. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 10000) 第2 - T + 1行:每行2个数,X, Y中间用空格分割.(1 <= X <= Y <= 10^18

P1384 幸运数与排列

P1384 幸运数与排列 神奇的(逆)康托展开:求1到n的全排列中字典序第k小的排列 $k<=10^9<13!$,显然$k$最多只会影响后$13$位 前面一大串都是有序从小到大排列的,于是搞个数位dp 后面一小串用逆康托展开求出原串,枚举是否符合条件. #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> u