[日常训练] tty的方程
来源:互联网 发布:mac ps如何导入字体 编辑:程序博客网 时间:2024/05/17 07:25
问题描述
- tgopknight正在教sc捉数学题,今天他教的是加法和乘法和乘方。
- 唐沟铺的tgopknight果然神,他是这样教导的:
- “加法是基本的四则运算之一,它是指将两个或者两个以上的数、量合起来,变成一个数、量的计算。
- 乘法是指将相同的数加起来的快捷方式。其运算结果称为积。从哲学角度解析,乘法是加法的量变导致的质变结果。
- 求
n 个相同因数乘积的运算,叫做乘方。 - 好!我们来举个例子比如
1+2=3 、1×2=2 、32=9
- “现在你都学会了么?”
- “蒽!”sc回答道,“这怎么能难倒tgopknight?”
- 骑士大爷得意的笑了一笑,现在你应该就会捉这道题了:
- 已知
a+b+c=n,a2+b2+c2=m,a3+b3+c3=k ,求解a,b,c 。 - 这可难倒了聪明的sc,她立刻给tgopknight去看,tgopknight虽然是丰之崎学园的学神,但是高端科学家唐沟铺骑士的题岂能简简单单的秒掉。她想到了机智聪明的学OI的你一定可以解决
输入格式
- 四个整数
n,m,k,p - 其中
n,m,k 如上文所述,p 为输出格式的参数
输出格式
- 由于
a,b,c 可能有多组解,且实数具有一定的精度误差。本题采取了特殊的处理方式。 - 选手仅需要输出
ap+bp+cp 可以保证其值唯一确定。输出采取A/B的形式,其中(A,B)=1 ,若答案为0 请输出0/1
数据范围
- Subtask1:
10 分,测试点数1:n=6,m=14,k=36,1≤p≤10 - Subtask2:
10 分,测试点数1:n=1,m=2,k=3,1≤p≤10 - Subtask3:
30 分,测试点数5:p=4,0≤n,m,k≤10 - Subtask4:
50 分,测试点数10:对于前5个测试点满足:0≤n,m,k,p≤15 - 对于后五个测试点满足:
0≤n,m,k≤20,0≤p≤10
分析 DP + 数学
- 设
f[i]=ai+bi+ci ,则(可以自己试着配一下)f[i]=(a+b+c)f[i−1]−(ab+bc+ac)f[i−2]+abc⋅f[i−3](i>3) - 考虑转移方程中的三个参数
a+b+c=n ab+bc+ac=(a+b+c)2−(a2+b2+c2)2=n2−m2 ∵(a2+b2+c2)(a+b+c)=nm a3+b3+c3+(a+b+c)(ab+bc+ac)−3abc=nm k+n⋅n2−m2−3abc=nm ∴abc=k+n⋅n2−m2−nm3=2k+n3−3nm6
- 则转移方程就变为
f[i]=n⋅f[i−1]−n2−m2⋅f[i−2]+2k+n3−3nm6⋅f[i−3](i>3) - 因为要输出分数,我们用两个数组记录
f[i] 的分子和分母模拟分数运算, 两个数组都要开long_long 并且每求出一次都要约分
代码
#include <iostream>#include <cstdio>using namespace std;typedef long long ll;int n, m, k, P;ll g[15], f[15];inline ll gcd(ll x, ll y){ ll r = x % y; while (r) x = y, y = r, r = x % y; return y;}int main(){ freopen("math.in", "r", stdin); freopen("math.out", "w", stdout); scanf("%d%d%d%d", &n, &m, &k, &P); f[1] = n; f[2] = m; f[3] = k; g[1] = g[2] = g[3] = 1; const ll p = n * n - m, q = 2 * k + n * n * n - 3 * m * n; for (int i = 4; i <= P; ++i) { ll ax = n * f[i - 1], ay = g[i - 1]; ll bx = p * f[i - 2], by = 2 * g[i - 2]; ll cx = q * f[i - 3], cy = 6 * g[i - 3]; g[i] = ay * by / gcd(ay, by); g[i] = g[i] * cy / gcd(g[i], cy); f[i] = ax * g[i] / ay - bx * g[i] / by + cx * g[i] / cy; ll tmp = gcd(f[i], g[i]); f[i] /= tmp; g[i] /= tmp; } if (g[P] < 0 && f[P] > 0) g[P] = -g[P], f[P] = -f[P]; cout << f[P] << "/" << g[P] << endl; fclose(stdin); fclose(stdout); return 0;}
阅读全文
1 0
- [日常训练] tty的方程
- 日常训练 Idiot 的方程
- 日常训练 Idiot 的集合
- [日常训练] 树上的游戏
- [日常训练] CZA的蛋糕
- 日常训练20161013 棋盘上的象
- 日常训练 20170602 B君的教育
- 日常训练 20170628 神奇的玩具
- HEU日常训练10.02
- 日常训练小结
- 日常训练20161012 道路网
- 日常训练20161012 醉酒
- 日常训练20161014 跟踪
- 日常训练20161018 证据
- 日常训练20161018 subset
- 日常训练 平均数
- 日常训练 水箱
- 日常训练 棋盘游走
- c/c++文件的基本操作
- cmd命令窗口导入导出MySQL
- J2SE总结
- C++ primer 第五版 第三章练习答案
- LeetCode 11. Container With Most Water
- [日常训练] tty的方程
- ORB_SLAM2系列之三:ORB_SLAM2跑RGBD SLAM数据集
- 判断元素出栈、入栈顺序的合法性
- 《ActiveMQ in Action》【PDF】
- JS中常用的Math方法
- 矩阵链相乘
- Jfinal HttpKit.post(url,data)源码解析
- Winform中报表RDLC的设计与实现
- 6年前的防sql注入服务器安全配置文章,依然很有用