Language: C++

#include <bits/stdc++.h>とusing namespace std;と#define rep(i, n) for (int i = 0; i < (int)(n); i++)
はとりあえず毎回最初に書く（#include <bits/stdc++.h>はC++の機能を「全て」読み込むための命令です。例えばすでに紹介したcoutやendlは#include <bits/stdc++.h>によって読み込まれた機能です。 今後の解説で出てくるC++の機能の多くは#include <bits/stdc++.h>と書くことで利用できるようになります。これを書かずに読み込みが必要な機能を使った場合、エラーが発生します。）（using namespace std;はプログラムを短く書くための機能です。#includeで読み込んだC++の機能を利用するためには、通常はstd::coutやstd::endlのようにstd::をはじめに付ける必要があります。 using namespace std;を利用すると、このstd::を省略して書くことができます）
C++のプログラムはmain関数から始まる
cout << "文字列" << endl;で文字列を出力できる
//や/* */でコメントを書ける


cout
C++で文字列を出力するには cout（しーあうと） を使います。
出力する文字列を指定している部分は"Hello, world!"の部分です。
C++プログラムの中で文字列を扱う場合、" "で囲う必要があります。endlは改行を表しています。
数字なら" "は不要



書き方
コメントになる場所
//
同じ行の//を書いた場所より後
/* */
/*と*/の間

キーポイント
スペース・改行・インデントを使ってプログラムを見やすくする
プログラムは「書く→実行→正しく動作することを確認」で初めて完成と言える
	コンパイルエラーは文法のエラーで、プログラムは実行されない
	実行時エラーは内容のエラーで、プログラムは強制終了される
	論理エラーは内容のエラーで、プログラムは正しく動いているように見えてしまう
	エラーは「実行して動作を確認する」「Webで検索する」等して修正する
	エラーの大まかな発生箇所は./Main.cpp:行:文字目: errorからわかる
	エラーメッセージが複数表示された場合は最初のエラーから直す
	エラーの発生箇所は./Main.cpp:行:文字目: errorを読めば特定できますが、ずれることもある。

コンパイルエラー
コンパイルエラーとは、書いたプログラムの文法にミスがあるときに発生するエラーです。全角文字がプログラム中に入り込んだり、文末の;を忘れたときなどにはコンパイルエラーになります。プログラミング言語では「文法」が厳密に決められています。日本語などの人間が使う言語では、文法的に少し崩れた文でも意図が通じますが、プログラミング言語ではそうはいきません。コンパイルエラーが起きた場合、プログラムは一切動作しません。全角スペースのコンパイルエラーでは、stray ‘\343’ in programやstray ‘\200’ in programと表示されるのが特徴です。

実行時エラー
「プログラムを動かす」ことを「プログラムを実行する」といいます。実行時エラーとは、プログラムの文法に間違いはなかったが、内容に致命的な間違いがあったときに発生するエラーです。具体的には3÷0のように、0で割り算を行ってしまった場合など(error code136)に発生します。スマホアプリやゲーム等が強制終了してしまったとき、多くの場合実行時エラーが発生しています。実行時エラーが起きた場合、実行時エラーが起きる直前までプログラムは動作しますが、エラー以降は動かなくなってしまいます。
論理エラー
論理エラーとは、プログラムは一見正しく動作しているが、その動作が実は正しくないときに発生するエラーです。例えば、「300円のクッキーと100円のアメを買ったときに払うお金」を計算するプログラムでは300 + 100と計算するべきですが、間違って300 - 100としてしまった場合などは論理エラーに当たります。論理エラーは勘違いで生まれたり、タイピングのミスで発生したりと様々です。論理エラーは一見問題なくプログラムが動作してしまうため、発見することが難しくなりやすいです。


エラーの種類
ジャッジの判定
終了コード
コンパイルエラー
CE (Compile Error)
-1
実行時エラー
RE (Runtime Error)
0以外
論理エラー
WA (Wrong Answer)
0（エラーがない時と同じ）
実行時間制限超過※
TLE (Time Limit Exceeded)
9
「ジャッジの判定」は提出後の採点結果のことです。
「終了コード」はコードテスト上でプログラムを実行した後、画面の下部に表示されている数値のことです。コードテスト上でコンパイルエラーが発生した場合、「標準エラー出力」にエラーの詳細が表示されます。エラーの内容を読んだり、表示されているエラー内容を検索したりしてエラーを修正しましょう。※実行時間制限超過がAPG4bで発生する場合、提出先を間違えている可能性があります。説明ページではなく問題ページ(EX◯◯)に提出しているかを確認しましょう。


演算子
+足し算＝-引き算 （優先度）＜＜＜ *掛け算 ＝/割り算＝%余
C++では、整数同士で割り算した場合、結果は小数点以下を切り捨てした値になります。小数点以下を切り捨てないで計算してほしい場合、7.0 / 3.0のように.0をつけます。同様に7.0 / 3.5のような計算も行えます。計算の途中にdouble型のデータが入ってくるかどうかで、小数点以下を切り捨てるかどうかが変わってきます。( )を使って優先順位を変えることもできます。同じ優先順位の演算子が並んでいる式は、基本的に左の演算子から順に計算されます。割り算/のある整数同士の計算では、切り捨てが行われるタイミングの違いで結果が異なることがあります。

剰余演算A % Bを行う時にAまたはBが負の数の場合、計算結果は以下のようになります。
Aが正のとき：|A|%|B|A
Aが負のとき：−(|A|%|B|)
つまりBの正負に関わらず、計算結果はAの正負と一致します。

例えば3÷2×4を計算する場合、書き方によって2つの計算結果が考えられます。
3 / 2 * 4 → 1 * 4 → 4
3 * 4 / 2 → 12 / 2 → 6
多くの場合、割り算はできるだけ後の方で行うようにしたほうが正しい結果になります。



=は代入
int整数 double小数 string文字列　bool型というデータ型があります。この型の変数にはtrueまたはfalseだけが入ります。文字を扱うにはchar型を使う
まず宣言(int name;のように、設定文字を置く)int name = 10;のように同時にできるし、int a = 10, b = 5;のように「,」を挟むことで同時に2つ言える
変数の値を読み書きすることを「変数にアクセスする」ということもあります。変数を宣言した後の最初の代入を初期化といいます。
数字で始まる名前、「_」以外の記号が使われている名前、キーワード（C++が使っている一部の単語）は使用不可
string型とint型、string型とdouble型は変換できない型の組み合わせなのでコンパイルエラーになります。
doubleとintは互いに代入できる（小数点以下切り捨て）
変数の初期化し忘れによるバグ（プログラムのミス）を防ぎたい場合、すべての変数を宣言時に適当な値で初期化しておくのも一つの手です。


入力を受け取るには cinと>> を使います。
入力が複数ある場合は、スペースか改行で区切られていれば分解して入力してくれます。 cin >> a >> b >> c;のようにしてもOK


if文を使うと「ある条件が正しい時だけ処理をする」というプログラムが書ける
else句は、if文の後に書くことで「if文の条件が偽の時」に処理を行えるようになります。
else ifは「『前のif文の条件が偽』かつ『else ifの条件が真』」の時に処理が行われます。
if文の中にif文を入れることをif文のネストと言います。
比較演算子	意味
x == y	xとyは等しい
x != y	xとyは等しくない
x > y	xはyより大きい
x < y	xはyより小さい
x >= y	xはy以上
x <= y	xはy以下
!(条件式)	条件式の結果の反転
条件式1 && 条件式2	条件式1が真 かつ 条件式2が真
条件式1 || 条件式2	条件式1が真 または 条件式2が真


条件式の結果は真のとき1に、偽のとき0になる
1をtrueで、0をfalseで表す
bool型はtrueとfalseだけが入る型
演算子の優先順位の関係で、条件式を( )で囲まないといけないので注意して下さい。
実は、0と1以外の数値もbool型の値のように扱うことができます。
その場合、0のときだけfalse、それ以外の数値はすべてtrueになります。
C++では「1と真」「0と偽」はほとんど同じ意味になります。


今までmain関数やif文の後には{ }を書いてきました。この{ }で囲った部分のところをブロックといいます。
あるブロックの中で宣言した変数は、それより内側のブロックでしか使えないというルールがあります。そして、その変数が使える範囲のことをスコープといいます。
変数を使える条件は次の2つです。

変数を使っている場所より前で宣言されている
変数を使っている場所と同じか、より外側のブロックで宣言されている
同じ名前の変数のスコープが重なっていて、候補が複数考えられる場合は次の条件で使う変数が決められます。
候補の変数のうち最も内側で宣言されている

x = x + yはx += yのように短く書ける
x += 1はx++(++x)と書ける（インクリメント）
x -= 1はx--(--x)と書ける（デクリメント）
x += 1 + 2;はx = x + (1 + 2);と同様


変数iを利用することで「何回目の繰り返しか」という情報を使うことができます。
次のプログラムは「"Hello rep: （何回目の繰り返しか）"と出力する処理」を3回繰り返すものです。
カウンタ変数iを使えば「何回目の繰り返しか」という情報が利用できる
カウンタ変数は0から始まり「回数−1」で終わる
カウンタ変数名は変更できる
breakを使うとループを途中で抜けられる
continueを使うと後の処理を飛ばしてrepの次のループへ行ける
while,for 「N回処理する」というプログラムを書く場合、「iを0からはじめ、iがNより小さいときにループする」という形式で書くのが一般的です。
while(条件式){}
for (初期化; 条件式; 更新) {}
for文とwhile文の違いは主に2点、「カウンタ変数のスコープ」と「continueをしたときの動作」
範囲for文の存在　配列ならこっちがいい(break,continueも使える)、string型でもchar型にできる
for (配列の要素の型 変数名 : 配列変数) {  // 各要素に対する処理}
配列の全ての要素に対する処理を行なう場合 → 範囲for文
それ以外で一定回数繰り返し処理する場合 → for文
それ以外の場合 → while文


文字列変数.size()で文字列の長さを取得できる
文字列変数.at(i)でi文字目にアクセスできる
文字列変数.at(i)のiを添え字という
添字は0から始まる
添字の値が正しい範囲内に無いと実行時エラーになる
string型を表すために" "で囲ったように、char型を表すためには' 'で囲います
文字列の一部を書き換えるときや比較をするときはchar型を使う必要があります。
添字が範囲外のときのエラーでは、1行目の最後で'std::out_of_range'（範囲外）というエラーメッセージが表示されることが特徴です。
C++で全角文字を扱う場合、string型ではない別の文字列型（u32string等）が用いられます。
.size()や後述する==演算子等を利用する場合、一度変数に格納するか、"文字列"s.size()のように" "の末尾にsをつける必要があります。
単に"文字列".size()と書いた場合はコンパイルエラーになります。
string型とchar型は==で比較できません。string型とchar型を+すると、文字列同士と同様に連結できます。
char型の変数にcinで入力すると一文字ずつ取り出すことができます。
「改行」などの特殊な文字をプログラム中で表現する場合、エスケープシーケンスを利用します。
空白で区切らずに行単位で入力を受け取りたい場合はgetlineを使います。 getline(cin, s); で「 変数sで入力を一行受け取る」
エスケープシーケンス
\n     改行
\"	二重引用符 "
\'	引用符 '
\\	バックスラッシュ（または半角円記号） \
\t	タブ（水平タブ）
\r	復帰（一部の実行環境では改行に用いる）

演算子
==	2つの文字列が完全に一致している
!=	2つの文字列に違いがある
<, <=, >, >=	辞書順による比較
C++の順序では'0'～'9'→'A'～'Z'→'a'～'z'の順になっていることに注意




配列は様々なデータの列を扱うことができる機能
vector<型> 配列変数名;で配列変数を宣言できる
配列変数名 = { 要素1, 要素2, ... };で配列変数に値を代入できる
配列変数.pop_backを使えば配列の末尾の要素を削除することもできます。
配列変数.at(i)でi番目の要素にアクセスできる、配列変数[添字]でも可#define _GLIBCXX_DEBUGをつけるとよい
配列変数.size()で配列の要素数を取得できる
配列変数.push_backを使えば、配列の末尾に要素を追加することができます。
配列変数同士は==で比較することができますが、要素列挙とは比較不可
vector<型> 配列変数名(要素数,初期値)と書くと指定した要素数で配列を初期化できる(「,初期値」がなければ0に初期化)
配列でN個の入力を受け取るときは、N要素で初期化した後、for文の中でatを使って1ずつ受け取る
vector<int> vec(N);
for (int i = 0; i < N; i++) { cin >> vec.at(i);}
で大量のデータを扱える
 vec = { 25, 100, 64 };という感じで生成できる



関数を使うとプログラムのまとまった機能を簡単に使うことができる
C++で用意されている、関数等がまとまっているもののことをSTLという
関数名(引数1, 引数2, ...)で関数を呼び出せる
関数に( )で渡す値のことを引数という
関数の計算結果のことを返り値または戻り値という
引数と返り値は型のルールが決まっており、間違えるとコンパイルエラーになる

min(a, b)aとbのうち小さい方の値を返す
max(a, b)aとbのうち大きい方の値を返す
swap(a, b)変数aと変数bの値を交換する
sort(vec.begin(), vec.end())配列変数vecをソートする（要素を小さい順に並び替える）
reverse(vec.begin(), vec.end())配列変数vecの要素の並びを逆にする


関数を自分で作る
返り値の型 関数名(引数1の型 引数1の名前, 引数2の型 引数2の名前, ...) {処理｝
関数の返り値はreturn文を使ってreturn 返り値;で指定する
関数の返り値が無い場合は返り値の型にvoidを指定し、return文はreturn;と書く
関数の引数が不要な場合は定義と呼び出しで()だけを書く
処理がreturn文の行に到達した時点で関数の処理は終了する
返り値がある関数で返り値の指定を忘れた場合、どんな値が返ってくるかは決まっていない
引数に渡された値は基本的にコピーされる
プロトタイプ宣言(「関数の名前」と「引数と返り値の型」だけを先に宣言)をすれば関数を定義する前に呼び出すことができます。
「引数の型」または「引数の数」が異なる場合は、同じ名前の関数を定義することができます。これを関数のオーバーロードと言います。
関数の中で同じ関数を呼び出すこともできます。
このような関数を再帰関数と言います。



2次元配列は2次元の表を扱うときに便利
vector<vector<要素の型>> 変数名(要素数1, vector<要素の型>(要素数2, 初期値))で宣言できる
初期値は省略可能、intなら0,stringなら空文字列
変数名.at(i).at(j)でi行目j列目へアクセスできる、上からi番目、左からj番目
変数名.size()で縦の大きさを取得できる
変数名.at(0).size()で横の大きさを取得できる
要素を指定して初期化する例
vector<vector<int>> data = {  {7, 4, 0, 8},  {2, 0, 3, 5},  {6, 1, 7, 0},};
vectorをN個入れ子にしたものをN次元配列という
表のようなデータを扱う場合、一般的には
vector<vector<要素の型>> 変数名(縦の要素数, vector<要素の型>(横の要素数));とする
後から配列に要素を追加して使う場合などに、N×0の配列を宣言することがあります。
vector<vector<型>> 変数名(N);  // 「要素数0の配列」の配列
外側のvectorの初期値を省略することで、N個の配列の要素数はそれぞれ0になります。
N×0の二次元配列に後から要素を追加していく場合などに「行毎に要素数の違う二次元配列」ができることがあります。このような配列はジャグ配列と呼ばれることがあります。

参照により、変数に別名をつけることができ、一ついじればもう片方もいじれる
参照先の型 &参照の名前 = 参照先;で参照を宣言できる
通常の変数のように参照を宣言するときは参照先を指定する必要がある
関数の引数に参照を用いる場合は、その関数を呼び出す時に渡した変数が参照先になる
参照先を後から変更することはできない
引数が参照になっている関数を呼び出すことを参照渡しという 引数を直接見れる
参照渡しは、無駄なコピーを避けたり複数の結果を返したいときに便利


文字列の扱い、以降文字列はSと置く
S[n]で取得したい文字列のインデックス(前からn+1番目）を指定します。
探索したい文字列Xを用いてS.find(X)とすると、該当する初めの位置を返します。(なければstring::npos が返される)
n文字目から文字列Xを挿入したい場合はS.insert(n,X)
n番目から数えてm個の文字列をXに置換したい場合はS.replace(n,m,X)
//文字が英小文字かどうか判定
if(S[0] >= 'a' && S[0] <= 'z')
//文字が英大文字かどうか判定
if(S[0] >= 'A' && S[0] <= 'Z')
//文字が数字かどうか判定
if(S[0] >= '0')
isalpha(S),isdigit(S),islower(S),isupper(S)で各々アルファベットか、数字か、小文字か、大文字かわかる
S.pop_back,S.puxh_backで末尾追加、末尾削除
int a = S[0]-'0';で一文字ずつ数字に行ける


「ある関数の中で同じ関数を呼び出す」ことを再帰呼び出しという
再帰を行うような関数を再帰関数という
再帰呼び出しを行わずに完了できる処理をベースケースという
再帰呼出しを行い、その結果を用いて行う処理のことを再帰ステップという
再帰関数の実装方法3ステップ
1.「引数」「返り値」「処理内容」を決める
2.再帰ステップの実装 n=k→n=k+1
3.ベースケースの実装 n=1


数値の精度について
(型)値で変換できる(int)a;など
double型では約16桁の並びを保持できます。逆に16桁を超える小数を正確に扱うことはできません。
printf(フォーマット文字列, 埋め込みたい値1, 埋め込みたい値2, ...)
「フォーマット文字列」の部分は後で説明するフォーマット指定子を含む文字列を自由に指定できます。 フォーマット指定子を書いた部分に「埋め込みたい値」が順番に埋め込まれます。"x = %d, pi = %lf\n"のように
int	%d
int64_t	%ld（%lld）
double	%lf
char	%c
32ビットシステム上でint64_tをprintfで出力する場合、フォーマット指定子は%lldとする必要があります。


#include <bits/stdc++.h>
#include<iostream>
#include <ctype.h>
#include <sstream>
using namespace std;
using Graph = vector<vector<int>>;
#define  itn int
using ll=int64_t;
#define rep(i,n) for (int i = 0; i < (int) (n); i++)
using vi = vector<int>;
using vll = vector<ll>;
//GCD
long long gcd(long long a, long long b)
{if(a<b) swap(a,b);
   if (a%b == 0){return(b);}
   else{return(gcd(b, a%b));}
}
//lcm
long long lcm(long long a, long long b)
{return a * b / gcd(a, b);}

long long bikkuri(long long k){
    long long sum = 1;
    for (long long i = 1; i <= k; ++i)
    {
        sum *= i;
    }
    return sum;
}
int main() {
ll n;
cin>>n;
string ans = "";
while(n>0){n--;ans+=char('a'+n%26);n/=26;}
reverse ans;
cout<<ans;

}



Compiler output:
a.cc:1:33: warning: extra tokens at end of #include directive
    1 | #include <bits/stdc++.h>とusing namespace std;と#define rep(i, n) for (int i = 0; i < (int)(n); i++)
      |                                 ^~~~~~~~~
a.cc:1:10: fatal error: bits/stdc++.h>とusin: No such file or directory
    1 | #include <bits/stdc++.h>とusing namespace std;と#define rep(i, n) for (int i = 0; i < (int)(n); i++)
      |          ^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.