time:2020-07-20 20:00

一.编程题1
题目:是否可以把任意一个数分解成不同的3个正整数相加,且3个正整数的两两最大公约数为K
输入描述:
第一行包括一个数字T, 表示有T组数据
接下来T行每行包含两个正整数n,k(n为需要分解的数,k为分解出来的3个不同正整数两两的最大公约数)
1<=k<=n<=10^18,1<=T<=100
输出描述:
输出总共T行
对于每组数据输出一行3个正整数,x,y,z,满足互不相同,两两最大公约数为k,且x+y+z=n。如果无解则输出-1,如果有多组解,输出任意一组即可
示例1:
输入:
3
6 1
12 4
38 2
输出:
1 2 3
-1
6 10 22

def grd(a, b):
    if a < b:
        a, b = b, a
    while b:
        a, b = b, a%b
    return a


def three_grd(a, b, c, K):
    return grd(a, b)==K and grd(a, c)==K and grd(b, c)==K


def fun(n, K):
    nums = range(1, n)
    for i in range(len(nums)):
        left, right = i + 1, len(nums) - 1
        while left < right:
            s = nums[i] + nums[left] + nums[right]
            if s == n:
                if three_grd(nums[i], nums[left], nums[right], K):
                    return([nums[i], nums[left], nums[right]])
                while (left < right) and (nums[left] == nums[left + 1]):
                    left += 1
                while (left < right) and (nums[right] == nums[right - 1]):
                    right -= 1
                left += 1
                right -= 1
            elif s < 0:
                left += 1
            else:
                right -= 1
    return -1

二.编程题2
题目:有一个数字n,把他相邻两数字做差的绝对值,这样组成一个新数,对于新数继续处理,直到剩下一位数字为止,若剩下的这个数为7,则代表这个数是幸运数,求一个区间内满足的幸运数有多少个?
例如:219第一次变换,:第一位2-1=1,第二位|1-9|=8,新数为18,继续变换为7,停止,是幸运数
218第一次变换:第一位2-1=1,第二位|1-8|=7,新数为17,继续变化为6,停止,不是幸运数
输入描述:
第一行输入一个整数T,代表有T组测试数据
对于每一组测试数据,输入两个数l,r,代表要找的区间
1<=T<=10000
1<=l<=r<=10^9
输出描述:
对于每组数据,输出一个答案代表区间内幸运数的个数

示例1:
输入
3
1 10
1 1000
1 100000
输出
1
28
498