分数模板(C++模板)
貌似没什么用。。。没有多少毒瘤题要输出分数吧。。。
update:真的有,而且在NOIP模拟赛里出现了!写double的卡精度到怀疑人生!
可以套个兼容性比较好的高精度模板进来。
#include<bits/stdc++.h>
using namespace std;
namespace FlashHu{
#define RG register
#define I inline
#define R RG frac
#define OutputFormat 0
	template<typename T>
	T gcd(RG T a,RG T b){
		return b?gcd(b,a%b):a;
	}
	template<typename T>
	struct frac{
		T a,b;
		//initializations
		I frac(){
			a=(T)0;b=(T)1;
		}
		I frac(RG T x){
			a=x;b=(T)1;
		}
		I frac(RG T x,RG T y){
			a=x;b=y;
			this->init();
		}
		I void init(){
			assert(b);
			if(b<0)a=-a,b=-b;
			this->reduction();
		}
		I frac&operator=(RG T x){
			a=x;b=1;
			return*this;
		}
		I double to_double(){
			return(double)a/b;
		}
		//arithmetic operation
		I void reduction(){
			RG T g=gcd(abs(a),b);
			a/=g;b/=g;
		}
		I frac inv(){
			assert(a);
			return(frac){b,a};
		}
		I frac operator-(){
			return(frac){-a,b};
		}
		I frac&operator++(){
			a+=b;
			return*this;
		}
		I frac&operator--(){
			a-=b;
			return*this;
		}
		I frac&operator+=(R x){
			RG T g=gcd(b,x.b);
			a=b/g*x.a+x.b/g*a;(b/=g)*=x.b;
			this->reduction();
			return*this;
		}
		I frac&operator-=(R x){
			return*this+=-x;
		}
		I frac&operator*=(R x){
			RG T g1=gcd(abs(a),x.b),g2=gcd(abs(x.a),b);
			(a/=g1)*=x.a/g2;(b/=g2)*=x.b/g1;
			return*this;
		}
		I frac&operator/=(R x){
			return*this*x.inv();
		}
		I frac friend operator+(R x,R y){
			RG T g=gcd(x.b,y.b);
			x=(frac){x.b/g*y.a+y.b/g*x.a,x.b/g*y.b};
			x.reduction();
			return x;
		}
		I frac friend operator-(R x,R y){
			return x+-y;
		}
		I frac friend operator*(R x,R y){
			RG T g1=gcd(abs(x.a),y.b),g2=gcd(abs(y.a),x.b);
			(x.a/=g1)*=y.a/g2;(x.b/=g2)*=y.b/g1;
			return x;
		}
		I frac friend operator/(R x,R y){
			return x*y.inv();
		}
		//logic operations
		I bool operator!(){
			return!a;
		}
		I bool friend operator&&(R x,R y){
			return x.a&&y.a;
		}
		I bool friend operator||(R x,R y){
			return x.a||y.a;
		}
		I bool friend operator==(R x,R y){
			return x.a==y.a&&x.b==y.b;
		}
		I bool friend operator!=(R x,R y){
			return x.a!=y.a||x.b!=y.b;
		}
#define logop(op)												\
		I bool friend operator op(R x,R y){						\
			return (x+-y).a op 0;								\
		}
		logop(<);logop(>);logop(<=);logop(>=);
#undef logop
		//input and output
		I friend istream&operator>>(RG istream&is,R&x){
			x=0;
			static string s;is>>s;
			RG int pos=s.find_first_of('/');
			if(~pos){
				s[pos]=' ';
				istringstream(s)>>x.a>>x.b;
				x.init();
			}
			else istringstream(s)>>x.a;
			return is;
		}
		I friend ostream&operator<<(RG ostream&os,R x){
			os<<x.a;
			if(OutputFormat||x.b!=1)os<<'/'<<x.b;
			return os;
		}
	};
#undef RG
#undef I
#undef R
#undef OutputFormat
}
分数模板(C++模板)的更多相关文章
- C++:类模板与模板类
		6.3 类模板和模板类 所谓类模板,实际上是建立一个通用类,其数据成员.成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表.使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从 ... 
- C++:函数模板与模板函数
		6.1 模板的概念 C++允许用同一个函数定义函数,这些函数的参数个数和参数类型不同.例如求最大值的max函数, int max(int x,int y) { return (x>y ... 
- C++ template学习一(函数模板和模板函数)
		函数模板和模板函数(1)函数模板函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:templat ... 
- vs 2013下自定义ASP.net MVC 5/Web API 2  模板(T4 视图模板/控制器模板)
		vs 2013下自定义ASP.net MVC 5/Web API 2 模板(T4 视图模板/控制器模板): Customizing ASP.NET MVC 5/Web API 2 Scaffoldi ... 
- C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化
		模板类模板成员函数(member function template)隐式处理(implicit)变化 本文地址: http://blog.csdn.net/caroline_wendy/articl ... 
- .NET/ASP.NETMVC Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(一)
		.NET/ASP.NETMVC Model元数据.HtmlHelper.自定义模板.模板的装饰者模式(一) 阅读目录: 1.开篇介绍 2.Model与View的使用关系(数据上下文DataContex ... 
- C++类模板和模板类
		C++ 中有一个重要特性,那就是模板类型.类似于Objective-C中的泛型.C++通过类模板来实现泛型支持. 1 基础的类模板 类模板,可以定义相同的操作,拥有不同数据类型的成员属性. 通常使用t ... 
- Xamarin XAML语言教程控件模板的模板绑定
		Xamarin XAML语言教程控件模板的模板绑定 控件模板的模板绑定 为了可以轻松更改控件模板中控件上的属性值,可以在控件模板中实现模板绑定功能.模板绑定允许控件模板中的控件将数据绑定到公共属性上. ... 
- C++模板编程-模板基础重点
		模板基础 1.模板参数自动推导,如果是已知的参数类型与个数,这调用模板时可以不写类型. Cout<<max<int>(1,3);可以写为Cout<<max(1,3) ... 
- Django——3 模板路径  模板变量  常用过滤器  静态文件的使用
		Django 模板路径 模板变量 过滤器 静态文件的加载 模板的路径,有两种方法来使用 设置一个总的templates在大项目外面,然后在sittings的TEMPLATES中声明 在每一个APP中创 ... 
随机推荐
- Luogu4606 SDOI2018 战略游戏 圆方树、虚树、链并
			传送门 弱化版 考虑到去掉一个点使得存在两个点不连通的形式类似割点,不难想到建立圆方树.那么在圆方树上对于给出的关键点建立虚树之后,我们需要求的就是虚树路径上所有圆点的数量减去关键点的数量. 因为没有 ... 
- 让IIS7和IIS6识别PUT和DELETE请求
			项目组最近需要开展自动化测试,针对老的Aspx页面,这个做自动化测试的成本太高,于是我们想从老代码中封装一些ashx的Restful服务出来,Restful我们使用HTTP的GET.POST.PUT. ... 
- [Oracle]In-Memory的Join Group 位于内存的何处?
			In-Memory的Join Group 的数据字典位于内存的何处? 有客户问到,使用Oracle 的In-Memory功能时,如果用到了 Join Group,那么这些这些Join Group,位于 ... 
- .Net版本依赖之坑引发的搜查
			前言 今天上午,一个客户反馈XX消息没有推送到第三方链接.于是我查看了推送日志列表,并没有今天的.接着登录服务器查询文件日志,看到了记录.我们的代码步骤是消息先推送到消息队列,消费消息队列时,记录文件 ... 
- vue开发小结(上)
			前言: 18年年底,就一个字,忙,貌似一到年底哪个公司都在冲业绩,包括我们自己开发自己公司的项目也一样得加把劲.自从18年年初立了个flag17年年终总结——走过2017,迎来2018Flag到现在又 ... 
- Unity 敌人波次设计
			一.平均时间随机敌人 将所有种类敌人预制物体放在一个列表里面,每隔时间T从列表中随机选出一个生成在场景中. 二.时间加权紧迫度随机敌人 在随机情况下每种敌人出现的概率近似相等,当敌人种类较多时,有可能 ... 
- Centos7下关于系统用户密码规则-运维笔记
			针对Centos7下的系统用户的密码规则复杂度的设置,处于安全考虑,说明如下: 一.设置密码规则 1)密码长度.有效期 /etc/login.defs文件是当创建用户时的一些规划,比如创建用户时,是否 ... 
- Mongodb主从复制/ 副本集/分片集群介绍
			前面的文章介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 Master-Slave 模式(主从复制),一种是 Replica Sets 模式(副本集). Mong ... 
- 集群环境删除redis指定的key
			1.说明 redis集群上有时候会需要删除多个key,就必须需要登录到每个节点上,而且有可能这个key不在这个节点,这样删除起来就比较麻烦,下面提供一种便捷方式可以实现 2.查看redis集群中的ma ... 
- B. Forgery
			链接 [http://codeforces.com/contest/1059/problem/B] 题意 要伪造医生签名,先给你医生的签名nm的网格'.'表示空白',#'表示墨水,你的笔可以这么画以一 ... 
