51nod_1355
Posted 0922-Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod_1355相关的知识,希望对你有一定的参考价值。
题意
给出 \\(n\\) 个正整数 \\(a_1,a_2\\cdots,a_n\\),求 \\(\\operatornamelcm(F_a_1, F_a_2,\\cdots, F_a_n)\\)。
其中 \\(\\F_i\\\\) 为斐波那契数列。
\\(2\\le n\\le 50000, 1\\le a_i\\le 1000000\\)
3s
解答
斐波那契数列的最小公倍数很难直接求,但是其最大公约数却有优美的结论 \\(\\gcd(F_n, F_m) = F_\\gcd(n, m)\\),于是考虑将最小公倍数转化成最大公约数。
此处有 \\(\\mathrmMin-Max\\) 反演的经典推论:
证明很简单,分别考虑每个质因子,\\(\\operatornamelcm\\) 就是求其 \\(\\max\\),\\(\\gcd\\) 就是求其 \\(\\min\\),即证。
接下来开始推柿子:
第一步转化完毕!
接下来肯定不能直接枚举子集算,于是进行下一步的推倒:
我们用 \\(c_i\\) 表示 \\(i\\) 的倍数出现的次数。
对每个 \\(x\\) 分别考虑 \\(F_x\\) 的次数:
其中第三行中的 \\(i\\) 为枚举 \\(|T|\\)。
于是对于每个 \\(x\\) 枚举 \\(d\\) 计算,总复杂度是调和级数级别的,也就是 \\(\\mathcalO(n\\log n)\\) 的。
于是总复杂度为 \\(\\mathcalO(n\\sqrt n)\\),瓶颈在于枚举因子。
51nod_1417:天堂里的游戏
题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1417
假设 ans=n/m,C=(A+B)/2
若出正面 E_1 = nA-(m-n)C
若出反面 E_2 = (m-n)B-nC
由样例解释可知
得 m = A+B+2C,n=B+C
#include<bits/stdc++.h> using namespace std; typedef long long LL; LL gcd(LL a,LL b) { return b? gcd(b,a%b):a; } int main() { LL T;cin>>T; while(T--) { LL a,b,c; cin>>a>>b; c=(a+b)/2; LL m=a+b+2*c,n=b+c; LL g=gcd(m,n); printf("%lld/%lld\n",n/g,m/g); } }
以上是关于51nod_1355的主要内容,如果未能解决你的问题,请参考以下文章