- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我还有另一个有趣的编程/数学问题。
For a given natural number q from interval [2; 10000] find the number n
which is equal to sum of q-th powers of its digits modulo 2^64.
for q=3, n=153
;
for q=5, n=4150
。
最佳答案
有两个关键点,
q = 2
的情况。如果
d
数字位数
n
等于其位数的平方和,则
n >= 10^(d-1) // because it's a d-digit number
n <= d*9^2 // because each digit is at most 9
并且条件
10^(d-1) <= d*81
可以轻松转换为
d <= 3
或
n < 1000
。要检查的数字并不多,对它们的暴力破解速度很快。对于
q = 3
,条件
10^(d-1) <= d*729
产生
d <= 4
,但仍然没有很多要检查的数字。通过进一步分析,我们可以找到较小的边界,对于
q = 2
,最多三个数字的平方和最多为243,因此解决方案必须小于244。在该范围内的最大数字平方和达到199 :1²+9²+9²= 163,继续,您可以轻松地找到一个解必须小于100。(
q = 2
的唯一解决方案是1。)对于
q = 3
,四个数字立方体的最大和为4 * 729 = 2916,继续,我们可以看到
q = 3
的所有解都小于1000。但是由于模数要求,这种边界的改进仅对小指数有用。当数字的幂的总和可以超过模数时,它将分解。因此,我停止寻找最大可能的数字位数。
q
次幂的和,边界将近似为
q - (q/20) + 1
因此对于更大的
q
,从中获得的可能解决方案的范围是巨大的。
2 <= n < 2^64
,最多20位,其次是(模块化)数字功率和的排列不变性。
d
数字的单调序列,计算
q
-th次幂的和,并检查由此获得的数字是否具有正确的数字。
d
位数字序列的数量相对较小,因此使用它的蛮力变得可行。特别是如果我们忽略对总和没有贡献的数字(所有指数为0,
q >= 22
为8,
q >= 32
也为4,
q >= 64
的所有偶数)。
d
符号的长度为
s
的单调序列的数量为
binom(s+d-1, d)
s
对于我们来说最多9个,
d <= 20
,从
d = 1
到
d = 20
求和,每个指数最多要考虑10015004个序列。还不算太多
q
这样做花费的时间很长,但如果考虑到
q >= 64
,对于所有偶数位
x^q % 2^64 == 0
,我们只需要考虑由奇数位组成的序列以及长度为单调的序列的总数最多使用5个符号的20个字符是
binom(20+5,20) - 1 = 53129
。现在,看起来不错。
f
函数,并在寻找方程的解
n == (sum [f(d) | d <- digits(n)] `mod` 2^64)
其中
digits
将
n
映射到其数字列表。
f
,我们从数字列表到自然数构建一个
F
函数,
F(list) = sum [f(d) | d <- list] `mod` 2^64
然后,我们在寻找
G = F ∘ digits
的固定点。现在,且仅当
n
是
G
的固定点时,
digits(n)
才是
H = digits ∘ F
的固定点。因此,我们可以等效地寻找
H
的固定点。
F
是置换不变的,因此我们可以将自己限制在已排序列表中,并考虑
K = sort ∘ digits ∘ F
。
H
和
K
的不动点是一一对应的。如果
list
是
H
的一个固定点,则
sort(list)
是
K
的一个固定点,如果
sortedList
是
K
的一个固定点,则
H(sortedList)
是
sortedList
的一个置换,因此
H(H(sortedList)) = H(sortedList)
(即
H(sortedList)
)是
K
的一个固定点。和
sort
分别。
H
是
H
和
K
的不动点集之间的双射。
f(d)
为0(模264),则可能会进一步改善。令
compress
为一个从数字列表中删除带有
f(d)
mod
2^64 == 0
的数字的函数,并考虑该函数
L = compress ∘ K
。
F ∘ compress = F
开始,如果
list
是
K
的固定点,则
compress(list)
是
L
的固定点。相反,如果
clist
是
L
的固定点,则
K(clist)
是
K
和
compress
的固定点。
K
是
L
resp的不动点集之间的双射。
K
。 (并且
H(clist)
是
H
的不动点,而
compress ∘ sort
和
H
是
L
和
H
的不动点集之间的双射。)
d
位的压缩排序列表的空间足够小,足以强行考虑所考虑的
f
函数,即幂函数。
d
(由于模数而为20,对于较小的q
较小)。 d
位的压缩单调序列。 L
的不动点,如果是,F(sequence)
是G
的不动点,即问题的解决方案。 {-# LANGUAGE CPP #-}
module Main (main) where
import Data.List
import Data.Array.Unboxed
import Data.Word
import Text.Printf
#include "MachDeps.h"
#if WORD_SIZE_IN_BITS == 64
type UINT64 = Word
#else
type UINT64 = Word64
#endif
maxDigits :: UINT64 -> Int
maxDigits mx = min 20 $ go d0 (10^(d0-1)) start
where
d0 = floor (log (fromIntegral mx) / log 10) + 1
mxi :: Integer
mxi = fromIntegral mx
start = mxi * fromIntegral d0
go d p10 mmx
| p10 > mmx = d-1
| otherwise = go (d+1) (p10*10) (mmx+mxi)
sortedDigits :: UINT64 -> [UINT64]
sortedDigits = sort . digs
where
digs 0 = []
digs n = case n `quotRem` 10 of
(q,r) -> r : digs q
generateSequences :: Int -> [a] -> [[a]]
generateSequences 0 _
= [[]]
generateSequences d [x]
= [replicate d x]
generateSequences d (x:xs)
= [replicate k x ++ tl | k <- [d,d-1 .. 0], tl <- generateSequences (d-k) xs]
generateSequences _ _ = []
fixedPoints :: (UINT64 -> UINT64) -> [UINT64]
fixedPoints digFun = sort . map listNum . filter okSeq $
[ds | d <- [1 .. mxdigs], ds <- generateSequences d contDigs]
where
funArr :: UArray UINT64 UINT64
funArr = array (0,9) [(i,digFun i) | i <- [0 .. 9]]
mxval = maximum (elems funArr)
contDigs = filter ((/= 0) . (funArr !)) [0 .. 9]
mxdigs = maxDigits mxval
listNum = sum . map (funArr !)
numFun = listNum . sortedDigits
listFun = inter . sortedDigits . listNum
inter = go contDigs
where
go cds@(c:cs) dds@(d:ds)
| c < d = go cs dds
| c == d = c : go cds ds
| otherwise = go cds ds
go _ _ = []
okSeq ds = ds == listFun ds
solve :: Int -> IO ()
solve q = do
printf "%d:\n " q
print (fixedPoints (^q))
main :: IO ()
main = mapM_ solve [2 .. 10000]
它不是最佳化的,但从现在开始,它会在不到50分钟的时间内从我的盒子中找到
2 <= q <= 10000
的所有解决方案,从
2:
[1]
3:
[1,153,370,371,407]
4:
[1,1634,8208,9474]
5:
[1,4150,4151,54748,92727,93084,194979]
6:
[1,548834]
7:
[1,1741725,4210818,9800817,9926315,14459929]
8:
[1,24678050,24678051,88593477]
9:
[1,146511208,472335975,534494836,912985153]
10:
[1,4679307774]
11:
[1,32164049650,32164049651,40028394225,42678290603,44708635679,49388550606,82693916578,94204591914]
并以
9990:
[1,12937422361297403387,15382453639294074274]
9991:
[1,16950879977792502812]
9992:
[1,2034101383512968938]
9993:
[1]
9994:
[1,9204092726570951194,10131851145684339988]
9995:
[1]
9996:
[1,10606560191089577674,17895866689572679819]
9997:
[1,8809232686506786849]
9998:
[1]
9999:
[1]
10000:
[1,11792005616768216715]
从约10到63的指数花费的时间最长(个别地,不是累积的),由于减少了搜索空间,因此从64指数开始的速度显着提高。
关于algorithm - 数字等于其数字的幂的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10286999/
我基本上有三个表: hunt_c_usershunt_c_collected_eggshunt_c_achievements 我目前只使用 hunt_c_users 和 hunt_c_collecte
我已经计算了不同表中计数的总和。这会执行两次,每个 performanceID 一次。现在我想得到两个总和的总和。 下面是我目前做的两个总和的代码: SELECT SUM((COUNT (Bo
我有一个对 2 个值求和的脚本。我计划添加更多值(value),但首先我需要让它发挥作用。人们告诉我给他们 NUMBER 值,所以我这样做了,但现在它甚至没有给出输出。 base = 0; $("#F
我正在尝试计算在我们的数据库中跟踪的花费总额。每个订单文档包含一个字段“total_price” 我正在尝试使用以下代码: db.orders.aggregate({ $group: {
给定 Excel 2013(或更高版本)中的 2 个命名表: tbl发票 ID InvRef Total 1 I/123 45 2 I/234
希望你们一切都好。我来这里是因为我从今天早上开始就试图解决一个问题,我再也受不了了。 这就是上下文:我有一个 excel 工作簿,其中有不同的工作表,其中包含不同国家/地区的不同商业计划。我的目标是制
我有一份报告显示客户订购的产品及其价格: CompanyA Product 7 14.99 CompanyA Product 3 45.95 CompanyA Prod
我使用此python客户端: https://github.com/ryananguiano/python-redis-timeseries 如何汇总所有匹配? ts = TimeSeries(cli
希望创建一个总和和计数公式,该公式将自动调整以适应范围内插入的新行。 例如,如果我在单元格 D55 中有公式 =SUM(D17:D54)。每次我在该范围内插入新行时,我都需要更改公式的顶部范围来解释它
所以,我需要聚合日期相同的行。 到目前为止,我的代码返回以下内容: date value source 0 2018-04-08 15:52:26.1
我有数字输入 数量约为 30 我需要将它们全部汇总到一个字段 我拥有的在下面 查看:
您好,我正在尝试根据以下数据计算过去三个月中出现不止一次的不同帐户 ID 的数量;我想要 2 作为查询结果,因为 test1@gmail.com 和 test2@gmail.com 出现超过 1 次。
我有两个带有以下字段的表: ... orders.orderID orders.orderValue 和 payments.orderID payments.payVal 在 payments.pay
我想按 image_gallery 和 video_gallery 两列的 DESC 进行排序。 SELECT b.*, c.title as category, (S
实际上我的原始数据库为 SELECT sum(data1,data2) as database_value,sum(data3,data4) as database_not_value from t
我试图获取三个分数中每一个的值并将它们相加并显示在“总计:”中。我的问题是,我不知道如何做到这一点,以便每次其中一个分数值发生变化时,相应的总分值也会随之变化。 我可以在某处调用“onchange”来
如何获得按第一个值分组的元组列表中第二个和第三个值的总和? 即: list_of_tuples = [(1, 3, 1), (1, 2, 4), (2, 1, 0), (2, 2, 0)] expec
我正在尝试将我的列表中的整数转换为列表的总和和平均值,并说明任何低于冰点 F<32 的温度。每当我尝试获取总和或平均值时,我都会收到错误提示“+: 'int' 和 'str' 不支持的操作数类型”。我
在我的 ios 项目中,我使用了两个实体 (CoreData):具有一对多关系的 Person 和 Gifts 我知道如何计算给一个人的礼物总和: NSDecimalNumber *orderSum=
我有两个表(输入和类别): CREATE TABLE categories ( iId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, sNam
我是一名优秀的程序员,十分优秀!