_rqy's Code Style for OI
_rqy's Code Style for OI
Inspired by Menci's Code Style for OI
本文介绍_rqy的OI中的代码规范。其来源主要为_rqy的长期积累及参考Google代码规范、Menci的规范。
可能会update。
概述
#include
语句必须置于整个程序的开头。
不应using namespace foo;
。若有必要可以using foo::bar;
。
单行字符数必须不超过80。
预编译
#include
的多个库顺序可有以下两种:
- C++标准库在前,之后是C标准库,再后为其它(如交互库等)。(工程代码中,本
cpp
所对应的.h
文件应置于开头。) - (仅适用于OI)按字典序依次排列。
可以使用#include <foo>
时绝不使用#include "foo"
。
如果有多层嵌套#if #endif
,#endif
后应有对应的注释标识出与其对应的#if
。
尽量不要适用#define
而使用const
, typedef
, inline
。
所有预编译命令不应缩进(见下)。
缩进
每个代码块采用2空格缩进。
空格及换行
大括号不换行。
需要加空格的地方:
- 二元运算符(包括赋值运算符)两侧(
,
运算符例外,见下); ,
及;
的右边(如果其不处于行尾);if
,for
等控制流关键字与其后的左括号之间 ;do-while
中的while
、if-else
中的else
与其前面的右大括号之间;- 所有左大括号的左侧(根据不换行的策略,左大括号不应处于行首);
?
:
的两侧(包括构造函数初始化列表中的:
);- 类型中
*
,&
的左侧(如:const int &a
,int A(int *&a)
。); - 花括号与其内部语句/数组初始化列表之间(如果在同一行);
- 常成员函数的
const
两侧。
一定不能加空格的地方:
- 小括号及中括号与其内部的表达式/参数列表之间;
- 函数名与左括号之间(包括声明/定义/使用);
- 单目运算符(
!
,-
,*
,&
,~
)之后(或自增自减运算符与其操作数之间); ,
及;
的左侧;- 类型中
*
,&
的右侧; .
,->
,::
的两侧;operator
与所要重载的运算符之间(运算符与参数列表之间,根据第2条,也不应空格)。
若表达式过长内部可以换行,运算符处于行首(而非行尾);缩进以使表达式对齐为准;换行的优先级较高的子表达式也应加括号以避免误读。
参数列表/初始化列表过长时内部也可换行,逗号处于行尾;缩四空格。
例子:
struct AVeryVeryVeryVeryVeryVeryVeryVeryVeryLongStruct{
int aVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongVariable, d;
AVeryVeryVeryVeryVeryVeryVeryVeryVeryLongStruct(int a, int b, int c, int d)
: aVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongVariable(a) {
this->d = b + c * d;
}
};
int main() {
int thisVariableIsToBeLong = 2, thisVariableIsToBeLongerAndLonger = 23;
AVeryVeryVeryVeryVeryVeryVeryVeryVeryLongStruct s(
thisVariableIsToBeLong, thisVariableIsToBeLong,
thisVariableIsToBeLongerAndLonger,
thisVariableIsToBeLongerAndLonger
);
printf("%d\n", s.d);
}
空行
所有#include <foobar>
与using foo::bar;
之间不应空行,之后应空一行。
一系列常量定义的上下应有空行。
函数/结构体定义两侧应有空行(一系列联系密切的模板函数,如min
,max
,之间可以不空行)。
一系列全局变量定义的上下应有空行。
语句之间可根据其意义酌情空行。
任何位置不能出现连续的两个(或以上)空行。
函数定义
main
函数返回值必须为int
,return 0
不可忽略;
类/结构体传参在大多数情况下不应传值(除非难以避免地产生拷贝,或一些特殊要求),而应传引用。
极其简短的函数可以写作一行(但绝不能超过80字符),此时花括号内部应有空格(空函数体{}
除外)。
单个函数的长度不应过长(例如超过100行)。
命名规则
一般情况下应采用驼峰命名法,变量开头小写,函数/类/结构体开头大写。
特例:
main
函数;- 变量可以以一个小写字母命名;
- 全局数组名可使用1个大写字母+0~2个数字命名,如
A
,T1
,F01
; - 模板。如
readInt
,min
,max
,pow_mod
; - 采用对应算法缩写,如
KMP
,CRT
,NTT
,CDQ
; - 常量可以大写字母命名,如
N
,M
; - 临时变量可以以下划线开头。
Example Code
#include <algorithm>
#include <cctype>
#include <cstdio>
typedef long long LL;
inline int readInt() {
int ans = 0, c;
while (!isdigit(c = getchar()));
do ans = ans * 10 + c - '0';
while (isdigit(c = getchar()));
return ans;
}
const int mod = 998244353;
const int g = 3;
const int N = 200050;
inline LL pow_mod(LL x, int p) {
LL ans = 1;
for ((p += mod - 1) %= (mod - 1); p; p >>= 1, (x *= x) %= mod)
if (p & 1) (ans *= x) %= mod;
return ans;
}
LL inv[N];
int n;
void NTT(LL *A, int len, int opt) {
for (int i = 1, j = 0; i < len; ++i) {
int k = len;
while (~j & k) j ^= (k >>= 1);
if (i < j) std::swap(A[i], A[j]);
}
for (int h = 2; h <= len; h <<= 1) {
LL wn = pow_mod(g, (mod - 1) / h * opt);
for (int j = 0; j < len; j += h) {
LL w = 1;
for (int i = j; i < j + (h >> 1); ++i) {
LL _tmp1 = A[i], _tmp2 = A[i + (h >> 1)] * w;
A[i] = (_tmp1 + _tmp2) % mod;
A[i + (h >> 1)] = (_tmp1 - _tmp2) % mod;
(w *= wn) %= mod;
}
}
}
if (opt == -1)
for (int i = 0; i < len; ++i)
(A[i] *= -(mod - 1) / len) %= mod;
}
LL F[N], G[N];
LL T1[N * 4], T2[N * 4];
void Conv(LL *A, int n, LL *B, int m) {
int len = 1;
while (len <= n + m) len <<= 1;
for (int i = 0; i < len; ++i)
T1[i] = (i < n ? A[i] : 0);
for (int i = 0; i < len; ++i)
T2[i] = (i < m ? B[i] : 0);
NTT(T1, len, 1);
NTT(T2, len, 1);
for (int i = 0; i < len; ++i)
(T1[i] *= T2[i]) %= mod;
NTT(T1, len, -1);
}
void Solve(int l, int r) {
if (l == r - 1) {
F[l] = (l == 0 ? 1 : F[l] * inv[l] % mod);
return;
}
int mid = (l + r) >> 1;
Solve(l, mid);
Conv(F + l, mid - l, G, r - l);
for (int i = mid; i < r; ++i)
(F[i] += T1[i - l]) %= mod;
Solve(mid, r);
}
int main() {
n = readInt();
inv[1] = 1;
for (int i = 2; i <= n; ++i)
inv[i] = -(mod / i) * inv[mod % i] % mod;
for (int i = 1; i <= n; ++i) {
scanf("%lld", &G[i]);
(G[i] *= i) %= mod;
}
Solve(0, n + 1);
for (int i = 1; i <= n; ++i)
printf("%lld\n", (F[i] + mod) % mod);
return 0;
}
注:此为多项式\(\exp\)模板。
_rqy's Code Style for OI的更多相关文章
- Code Style for OI
Code Style for OI #include #define 尽量少用 #include 能#include <foo>就不#include "foo" #if ...
- 与你相遇好幸运,The Moe Node.js Code Style Guide
The Moe Node.js Code Style Guide By 一个最萌的开发者 @2016.9.21 >>代码是人来阅读的,格式规范的代码是对编程人员最好的礼物 :) > ...
- Eclipse setting Java code style and codetemplate
1.open the eclipse tool window First click the Window menu,then check the children's menu which name ...
- Java Code Style
近期困惑于团队成员代码风格迥异,代码质量不可控,作为一名老司机,忧患于后期服务的可维护性,多次一对一的代码Review,耗时耗力不说,效果也不明显.痛定思痛,多次反思之后得出结论:无规矩不成方圆,可靠 ...
- 【Idea】idea code style配置eclipse code formatter
在eclipse中有自动配置code style的功能 ,但是idea上却没有,这个时候需要自己手工配置 1. 在idea中找到Preference->Plugins->Browse re ...
- checkstyle.xml Code Style for Eclipse
1. Code Templates [下载 Code Templates] 打开 Eclipse -> Window -> Preferences -> Java -> Cod ...
- Javascript Code Style Guide
本指南采用的Airbnb发布的基于ES5的JavaScript Code Style. ES5 英文版:https://github.com/airbnb/javascript/tree/es5-de ...
- 在IntelliJ IDEA中配置Google Java Code Style及代码格式化快捷键
google-java-format plugin should intercept the “Reformat Code” action in IDEA (Ctrl+Alt+L) and apply ...
- intelij IDEA设置goole code style风格
1.安装google-java-format 插件 file ->Setings... ->pligins 输入上诉插件安装 2.下载IntelliJ Java Goog ...
随机推荐
- Elasticsearch集群搭建及使用Java客户端对数据存储和查询
本次博文发两块,前部分是怎样搭建一个Elastic集群,后半部分是基于Java对数据进行写入和聚合统计. 一.Elastic集群搭建 1. 环境准备. 该集群环境基于VMware虚拟机.CentOS ...
- Nginx 简易教程
Nginx 本项目是一个 Nginx 极简教程,目的在于帮助新手快速入门 Nginx. demos 目录中的示例模拟了工作中的一些常用实战场景,并且都可以通过脚本一键式启动,让您可以快速看到演示效果. ...
- IntelliJ IDEA导入多个eclipse项目到同一个workspace下
IntelliJ IDEA 与eclipse在新建项目上工作区的叫法略有不同,区别见下图. 我们在eclipse都是在新建的workspace目录下新建我们的项目,但是在IDEA中没有workspac ...
- (转) CentOS7.4 + MySQL8.0 + Git + Gogs搭建
原文:https://blog.csdn.net/qq_16075483/article/details/80295793 1.装系统,这个不会的下面就不用看了2.CentOS7.X安装MySQL8. ...
- (转)contextlib — 上下文管理器工具
原文:https://pythoncaff.com/docs/pymotw/contextlib-context-manager-tool/95 这是一篇社区协同翻译的文章,你可以点击右边区块信息里的 ...
- Thrift 基础(C++ rpc )
一.thrift简介 thrift是Facebook开源的一套rpc框架,目前被许多公司使用 我理解的特点 使用IDL语言生成多语言的实现代码,程序员只需要实现自己的业务逻辑 支持序列化和反序列化操作 ...
- Python -- 多媒体编程 -- 音乐播放
使用win32库的WMPlayer.OCX开发一个简易的音乐播放器 import sys from PyQt4 import QtGui, QtCore from win32com.client im ...
- PHP多进程系列笔记(四)
本节主要讲解Posix常用函数和进程池的概念,也会涉及到守护进程的知识.本节难度较低. Posix常用函数 posix_kill 向指定pid进程发送信号.成功时返回 TRUE , 或者在失败时返回 ...
- Django使用Signals监测model字段变化发送通知
上一篇文章<运维效率之数据迁移自动化>中讲到了工单通知,本文将介绍工单通知实现过程中的一些小技巧.所有演示均基于Django2.0 阅读此篇文章你可以: 解锁一个python if的使用新 ...
- MYSQLI_USE_RESULT or MYSQLI_STORE_RESULT
之前都是使用同事封装好的mysql类,今天做性能测试时自己手动编写了查询mysql的操作.偶然发现mysqli::query(或者mysqli_query)有一个参数$resultmode取值为MYS ...