目录

错排问题

有理数运算


错排问题

年会抽奖__牛客网

全部都不获奖的概率必定是由 n个人都拿错的情况种数n个人拿出的所有排列情况数
n个人拿出的所有排列情况数显然是n的阶乘。

假设a的名字没有被a拿到,其他n - 1个人都有可能拿到,即有n - 1种情况。假设b拿到了a的名字,那么对于b的名字有两种情况:

  • 第一种是b的名字被a拿到了,也就是ab互相拿到了对方的名字,那么对于其他n - 2个人互相拿错又是一个子问题f(n - 2).
  • 第二种是b的名字没有被a拿到,则剩下的问题是子问题f(n - 1).

因此可得递推公式f(n) = (n - 1) * (f(n - 1) + f(n - 2)).

最终得出公式n人都不获奖的概率h(n) = (n - 1) * (f(n - 1) + f(n - 2)) / (n!)

#include <iostream>
#include <cstdio>int main()
{long long d[21] = { 0, 0, 1 }; // 错排数量,预留第一项为0,配合下文中输入的nlong long f[21] = { 1, 1, 2 }; // 阶乘for (int i = 3; i <= 20; i++){d[i] = (i - 1) * (d[i - 1] + d[i - 2]); //错排的递推公式f[i] = i * f[i - 1]; //阶乘的递推公式}int n;while (std::cin >> n){printf("%.2f%%\n", 100.0 * d[n] / f[n]); //用100.0来把结果处理成double,保留两位小数}return 0;
}

有理数运算

Rational Arithmetic (20)__牛客网

实现对两个有理数的基本运算,包括加、减、乘、除。
输入描述:
每个输入文件只包含一个测试用例,测试用例会给出一行数据,格式为 “a1/b1 a2/b2”分子分母的范围都在长整型的范围内,如果数字为负,则符号只会出现在分子的前面。分母一定是非零数。
输出描述:
针对每个测试用例,都输出四行,分别是这两个有理数的和、差、积和商,格式为 “ 数 1 操作符 数 2 = 结果 ” 。注意,所有的有理数都将遵循一个简单形式 “k a/b” ,其中 k 是整数部分, a/b 是最简分数形式,如果该数为负数,则必 须用括号包起来。如果除法中的除数为 0 ,则输出 “Inf” 。结果中所有的整数都在 long int 的范围内。

C++标准类写法:

#include <iostream>
using namespace std;
typedef long long int64;class Rational
{
public:Rational(int64 n, int64 d){negetive = false;isZero = false;// 在输入时分母永远不可能为0,但是经过运算之后分母可能为0if (0 == d){isZero = true;return;}// 分子小于0,表示为负数if (n < 0){negetive = !negetive;}// 在输入时分母一定不会小于0, 但是经过计算之后分母也可能会小于0if (d < 0){negetive = !negetive;}// 如果分数是假分数,必须要将其化简为真分数 比如:5 / 3----> 1 2/3integer = n / d;numerator = n - integer * d;denominator = abs(d);// 如果不是最简的分数,还需要将其化简为最简的分数: 10 / 15 ----> 2 / 3// 只需给分子和分母分别除分子和分母最大公约数if (numerator < -1 || numerator > 1){int gcd = CalcGCD(abs(numerator), denominator);if (gcd){numerator /= gcd;denominator /= gcd;}}totalnumerator = integer * denominator + numerator;}Rational operator+(const Rational& r)const{int64 n = totalnumerator * r.denominator + r.totalnumerator * denominator;int64 d = denominator * r.denominator;return Rational(n, d);}Rational operator-(const Rational& r)const{int64 n = totalnumerator * r.denominator - r.totalnumerator * denominator;int64 d = denominator * r.denominator;return Rational(n, d);}Rational operator*(const Rational& r)const{int64 n = totalnumerator * r.totalnumerator;int64 d = denominator * r.denominator;return Rational(n, d);}Rational operator/(const Rational& r)const{int64 n = totalnumerator * r.denominator;int64 d = denominator * r.totalnumerator;return Rational(n, d);}
private:// 求最大公约数:辗转相除int64 CalcGCD(int64 a, int64 b){if (0 == b)return a;return CalcGCD(b, a % b);}friend ostream& operator<<(ostream& _cout, const Rational& r){if (r.isZero){_cout << "Inf";return _cout;}if (0 == r.integer && 0 == r.numerator){_cout << "0";return _cout;}// 如果是负数,需要用()括起来if (r.negetive){_cout << "(-";}// 输出有理数:整数 + 分数// 整数: 可能存在也可能不存在if (r.integer){_cout << abs(r.integer);// 如果分数部分存在,整数和分数之间有一个空格if (r.numerator){_cout << " ";}}// 分数: 可能存在也可能不存在if (r.numerator){_cout << abs(r.numerator) << "/" << r.denominator;}if (r.negetive){_cout << ")";}return _cout;}
private:int64 numerator; // 分子int64 denominator; // 分母int64 integer; // 整数部分bool negetive; // 负数bool isZero; // 分母是否为0int64 totalnumerator; // 参与运算的分子:原分子 + 整数部分
};int main()
{int64 n1, d1, n2, d2;while (scanf("%lld/%lld %lld/%lld", &n1, &d1, &n2, &d2) != EOF){Rational r1(n1, d1);Rational r2(n2, d2);cout << r1 << " + " << r2 << " = " << r1 + r2 << endl;cout << r1 << " - " << r2 << " = " << r1 - r2 << endl;cout << r1 << " * " << r2 << " = " << r1 * r2 << endl;cout << r1 << " / " << r2 << " = " << r1 / r2 << endl;}return 0;
}

C语言强行模拟:

#include<iostream>
#include<cmath>
using namespace std;typedef long long ll;ll gcd(ll a,ll b)
{if(b==0) return a;return gcd(b,a%b);
}void totout(ll n,ll d)
{if(d==0){cout<<"Inf"<<endl;return;}ll mod=gcd(n,d);n/=mod;d/=mod;ll zheng=n/d;ll fz=n-zheng*d;ll fm=d;if(fz<0||fm<0||zheng<0) cout<<"(";if(n==0) cout<<0;else if(zheng&&fz==0) printf("%lld",zheng);else if (zheng) printf("%lld %lld/%lld",zheng,fz,abs(fm));else if(fm<0) printf("-%lld/%lld",fz,abs(fm));else printf("%lld/%lld",fz,fm);if(fz<0||fm<0||zheng<0) cout<<")";
}void add(ll n1,ll d1,ll n2,ll d2)
{ll n=n1*d2+n2*d1;ll d=d1*d2;totout(n,d);
}
void sub(ll n1,ll d1,ll n2,ll d2)
{ll n=n1*d2-n2*d1;ll d=d1*d2;totout(n,d);
}
void mul(ll n1,ll d1,ll n2,ll d2)
{ll n=n1*n2;ll d=d1*d2;totout(n,d);
}
void div(ll n1,ll d1,ll n2,ll d2)
{ll n=n1*d2;ll d=d1*n2;totout(n,d);
}int main()
{ll n1,d1,n2,d2;scanf("%lld/%lld %lld/%lld",&n1,&d1,&n2,&d2);totout(n1,d1);cout<<" + ";totout(n2,d2);cout<<" = ";add(n1,d1,n2,d2);cout<<endl;totout(n1,d1);cout<<" - ";totout(n2,d2);cout<<" = ";sub(n1,d1,n2,d2);cout<<endl;totout(n1,d1);cout<<" * ";totout(n2,d2);cout<<" = ";mul(n1,d1,n2,d2);cout<<endl;totout(n1,d1);cout<<" / ";totout(n2,d2);cout<<" = ";div(n1,d1,n2,d2);return 0;
}

牛客竞赛每日俩题 - Day11相关推荐

  1. 牛客竞赛每日俩题 - Day12

    目录 set的插入删除 vector<string>的应用 set的插入删除 数据库连接池__牛客网 [解题思路] 循环接收每组用例,对于每组用例进行如下操作: 1. 依次获取每个状态,如 ...

  2. 牛客竞赛每日俩题 - Day7

    目录 经典01背包问题 二叉树遍历与构造(考研重点) 经典01背包问题 求正数数组的最小不可组成和_百度笔试题_牛客网 参考大佬题解: 动态规划:01背包问题(无物品价值),思想相同,题目最终要求有些 ...

  3. 牛客竞赛每日俩题 - Day9

    目录 日期推算 分解因数 日期推算 美国节日__牛客网 思路: 首先,我们要想找到一个月第N个星期W,一定需要一个参照物,最好的目标当然是这个月的第一天.拿到参照物后,我要能得 到参照物的星期数,然后 ...

  4. 牛客竞赛每日俩题 - Day3

    14天阅读挑战赛 目录 动态规划思想 经典DP 简单的数学问题 动态规划思想 查找两个字符串a,b中的最长公共子串_牛客题霸_牛客网 思路:         本题需要用动态规划求解,MCS[i][j] ...

  5. 牛客竞赛每日俩题 - 动态规划3

    目录 类01背包问题,选or不选 变种走方格 类01背包问题,选or不选 不同的子序列_牛客题霸_牛客网 问题翻译: S有多少个不同的子串与T相同 S[1:m]中的子串与T[1:n]相同的个数 由S的 ...

  6. 牛客竞赛每日俩题 - Day2

    14天阅读挑战赛 目录 字符串函数的熟练使用(模拟) 双指针+模拟+回溯 字符串函数的熟练使用(模拟) 扑克牌大小_牛客题霸_牛客网 别看题目很长,其实就是简单的斗地主,比较两手牌哪边大而已: 思路: ...

  7. 牛客竞赛每日俩题 - Day5

    目录 DP+贪心 dfs迷宫问题(最短路径) DP+贪心 年终奖_牛客题霸_牛客网 思路: 定义f(i,j)表示从左上角走到坐标(i,j)处能获得的最大奖励. 搜索所有从左上角走到右下角的路径,找到最 ...

  8. 牛客竞赛每日俩题 - 动态规划2

    目录 经典DP - 走方格 走方格2.0 分割回文串 分割回文串 - 回文优化 经典DP - 走方格 不同路径的数目(一)_牛客题霸_牛客网 状态:         子状态:从(0,0) 到达 (1, ...

  9. 牛客竞赛每日俩题 - Day1

    14天阅读挑战赛 目录 排序+dfs+简单剪枝 贪心+模拟 排序+dfs+简单剪枝 幸运的袋子_牛客题霸_牛客网 思路: 对于任意两个正整数 a,b 如果满足 a+b>a b ,则必有 一个数为 ...

最新文章

  1. 火焰图(Flame Graphs)的安装和基本用法
  2. OpenAI数十亿代码训出Codex:能将英语翻译成代码,给四句话就能写个神经网络...
  3. Java基本数据类型及String类
  4. emui10有机会升级鸿蒙,鸿蒙OS+EMUI10,能否助力华为实现科技突围?
  5. 次数统计-CountMap
  6. 工作286:v-model没有值会报错
  7. 俯瞰云原生,这便是供应层
  8. 按钮点击没有反应_时控开关按键没反应怎么办?
  9. GIS中的基本概念收集
  10. Ubuntu 14 中给 APACHE2安装 SSL 模块 Enable SSL site on Ubuntu 14 LTS, Apache 2.4.7:
  11. SAS的SQL过程(SQL Procedure in SAS)(一)
  12. 安装增强功能失败:Could not mount the media/drive C:\Program Files\Oracle\VirtualBox/VBoxGuestAdditions.iso
  13. ubuntu18.04: 安装nanomsg
  14. android最早的版本,光遇最早版本
  15. html表格优秀作品,40多个漂亮的网页表单设计实例
  16. APM32F103 RTC内部时钟源报警中断例程测试
  17. The Open Group中国首届线上大会 专场三亮点解读
  18. python mysql日期输出格式_Python/Shell/MySQL时间获取与格式转换
  19. 软件测试规范如写诗一样有多重要?
  20. Android网络连接网络

热门文章

  1. maria安装包mysql_linux安装Mariadb(mysql分支)
  2. H5创建webApp保存到桌面。
  3. c++小游戏合集(双人)
  4. SVN关于previous operation has not finished问题的解决
  5. Linux的sz和rz命令讲解
  6. idea 运行报错 Unrecognized option: --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
  7. pragma comment的使用(转)
  8. 操作系统hpf算法事例_操作系统调度算法是什么
  9. MEMS振镜原理-李萨如图形Matlab仿真
  10. 什么是七参数?什么是四参数?有什么不同