Project Euler 做题记录
Project Euler 太好玩了。。。(雾
Problem 675
设 \(\omega(n)\) 表示 \(n\) 的质因子个数,\(S(n)=\sum_{d|n}2^{\omega(d)}\),求 \(F(n)=\sum_{i=2}^nS(i!) \bmod (10^9+87)\)。
\(n=10^7\)
solution
$n=\prod_{i=1}^kp_i^{e_i}$ $S(n)=\prod_{i=1}^k(2e_i+1)$ 线性筛求出每个数的最小质因子之后就可以对 $10^7$ 以内的所有数质因数分解了。 时间复杂度 $O(\sum_{i=1}^n\omega(i))$Problem 225
Tribonacci Number:\(T_1=T_2=T_3=1\),\(T_n=T_{n-1}+T_{n-2}+T_{n-3}\)。
求第 124 小的奇数 \(k\) 满足对任意正整数 \(n\),\(k\not|T_n\)。
solution
答案很小,暴力即可。Problem 137
设 Fibonacci 的生成函数为 \(A_F(x)\),若 \(x\in \Q_+\) 且 \(A_F(x)\in \N_+\),则称 \(A_F(x)\) 为 Fibonacci golden nuggets。求第 15 小的这样的数。
若 \((c,d)=1\),因为 \((cd,c^2-cd+d^2)=(c,c^2-cd+d^2)(d,c^2-cd+d^2)=(c,d^2)(d,c^2)=1\),所以 \(c^2-cd+d^2=1\)。
结论:\(x=\frac{F_{2n+1}}{F_{2n}}\)时 \(n=F_{2n+1}F_{2n}\),其中 \(F_n\) 是 Fibonacci 数。
证明咕了。。
Problem 330
设
其中 \(A(n),B(n)\in \N\),求 \((A(10^9)+B(10^9)) \bmod 77777777\)
设 \(b(n)=a(n)-1\),则
设 \(D(n)=\frac{n!b(n)}{e-2}\),则
所以 \(a(n)=\frac{(e-2)D(n)+n!}{n!}\),所以 \(A(n)=D(n),B(n)=n!-2D(n)\).
把 \(D(n)\) 求出即可。
打表发现,\(p\) 为质数时,从第 \(p\) 项开始,\(D(n)\bmod p\)的循环节为 \(p(p-1)\),证明不会。。。
77777777 分解质因数之后使用中国剩余定理合并即可。
Problem 474
题目描述:求 \(n!\) 的因数中\(\bmod k=m\) 的数量。
数据范围:\(n=10^6,k=10^5,m=65432\)。
这题就是个暴力。
首先把 \(\le n\) 的质数筛出来,把 \(n!\) 质因数分解,\(p\) 的指数 \(\sum_{i\ge 1} \lfloor\frac{n}{p^i}\rfloor\le n\sum_{i\ge 1}p^{-i}=\frac{n}{p-1}\)。\(f_{i,j}\)表示只看前 \(i\) 个质因数,\(\bmod k=j\) 的因数数量,直接转移是 \(O(kn\log\log n)\)的。
这个也可以跑出来,但是会跑死你。
考虑优化,因为 \(m\) 中 \(2\) 的次数为 \(3\),不含 \(5\) 质因子,且 \(k=2^5*5^5\),所以只有 \(8|j,16\not|j,5\not|j\) 的 \(j\) 才是有用的。于是带上了一个 \(\frac{1}{20}\) 的常数。可以在 1min 以内跑过去了。
Problem 608
题目描述:求 \(\sum_{d|m}\sum_{k=1}^n\sigma_0(dk)\)。
数据范围:\(m=200!,n=10^{12}\)。
code
```cpp #includeProblem 362
题目描述:设 \(f(n)\) 表示把 \(n\) 分解为一些\(\ge 2\) 的 Squarefree 的数的乘积的形式(无序)的方案数。求 \(S(n)=\sum_{i=1}^nf(i)\).
数据范围:\(n=10^{10}\).
(当 \(\mu(n)\not= 0\) 时 \(n\) 称为 Squarefree Number)
由于这个分解式要求无序,所以只能把 \(\le \sqrt n\) 的 Squarefree 的数求出来,设为 \(k_0,k_1,\ldots,k_{c-1}\),设 \(S(x,y)\) 表示只用 \(\ge k_x\) 的数分解 \([k_x,y]\) 的数。则有
第一个式子中:\(k_x\) 分解为 \(k_x\),然后枚举是否含有 \(k_x\) 作为其中一个数。
第二个式子中,\([k_x,y]\) 中的 non-squarefree 的数是不能分解的,必定在之前就被考虑过,而 Squarefree 的不能再分解,所以就是这个式子了。
这东西就是个容斥,枚举 \(i^2\) 作为它的平方因子。直接 \(O(\sqrt n)\) 做都可以。
顺便再把 \(S\) 和这个和式给记忆化一下。
时间复杂度并不知道,但是跑个十几秒就出来了。
code
```cpp #includeProblem 562
首先,我连毕克定理都忘了。
面积=内部点+边界点/2-1.
所以就是面积为 \(\frac{1}{2}\) 的三角形。
要求周长最长,所以最长边的两个端点一定离原点比较远。设离原点距离平方 \(\ge 10^{14}-10^3\). 然后用 exgcd 就可以解出第三个点了。
code 明天写。
Problem 490
题目描述:设 \(f(n)\) 表示长度为 \(n\) 的排列 \(1=p_1,p_2,\ldots,p_n=n\) 满足 \(|p_i-p_{i+1}|=3\) 的个数。
求 \(S(n)=\sum_{i=1}^nf(i)^3 \bmod p\)。
数据范围:\(n=10^{14},p=10^9.\)
pb 带我把这道题肝出来了。。。
设 \(f_n,g_n,h_n\) 表示在 \(1,2,\ldots,n\) 的排列中,\(1\rightarrow n,2\rightarrow n,3\rightarrow n\) 的方案数。
把(推式子->写代码->测样例)不断重复,就可以获得以下的式子:
然后化简:
然而并不知道怎么去掉 \(g_n\),所以硬上 BM.
所以早就该写个状压
感觉三次方爆拆也是有线性递推式的,所以硬上BM。由于模数是 10^9,所以要求出不取模的值,所以用三个质数算之后使用CRT合并。
递推式系数
``` 7,3,110,657,2152,-3069,-52635,-261302,-153696,1473808,2397069,-311428,15762353,23085711,-47100311,129068460,562670682,851932061,925364934,1130031754,-4818794712,-13912313165,-20035999720,-27503231654,8949378103,10592790453,86984066471,-56538383977,310493682996,-555465996642,1018117858828,-492151027284,2597031578551,-4155106947436,4585759018316,-9918477547884,15345098186233,-16703435094128,14108978306373,-27430610896121,34471508084833,-41664710509024,56721748256014,-66444180626409,72030686017061,-36937223139909,37807899843246,-79005671659204,99579386233244,-91805685058556,53280640807504,-20165321105154,-47200378525336,98926314244247,-29644108051680,-98742930470195,92925853017229,91456358240235,-227581074843374,140985746410706,38693277606439,-71589702321590,-22128540237021,81893506257373,-49141821193336,-2978665835660,11325445924806,-16572398684339,37247712591350,-42178276310845,25148411068672,-8098925759012,1492489231468,-1796923760449,-262361213538,2822570675476,-2009433760337,933638513260,-1282209459128,1230923844512,-565730597095,31120448364,210053308828,-141425154588,43691863656,-81272454172,113172412506,-83602207124,59855112573,-45210437862,28195771570,-13763616116,6190641463,-4427241075,3051495474,-1495697702,760716994,-480886330,299865824,-128022945,40583768,-17920921,6498090,-2262358,2082694,-2003166,925167,-110850,4595,-3599,902,-2625,3642,-2359,285,-1,-7,-1,2,-1,1 ```然后用矩阵做线性递推。
PS:答案有很多个7