アルゴリズムとデータ構造8 - 線形篩による一般乗法関数の計算
概要
競技プログラミングの問題を解く中で、線形篩を用いた一般乗法関数の計算方法を学んだので、その説明を行う。
前提知識
乗法的関数:任意の互いに素な整数p,qについてf(p)×f(q)=f(pq)を満たす関数。
完全乗法的関数:任意の整数p,qについてf(p)×f(q)=f(pq)を満たす関数。
線形篩:O(n)でn以下の素数を列挙するアルゴリズム。
適用範囲
任意の素数pに対して、f(p)およ ...
6月10日 19:05 投稿
2023年伝智杯プログラミング競技予選ソリューション
文字列連結
2つの文字列を入力として受け取り、連結して出力します。空白を含む可能性があるため、getline関数を使用します。
#include <iostream>
#include <string>
using namespace std;
int main() {
string a, b;
getline(cin, a);
getline(cin, b);
cout << a + b;
return 0;
}
最小差分値
整数配列内の隣接要素間の最小差 ...
6月4日 19:44 投稿
AtCoder初心者コンテスト443 解説
D - パンライン問題
この問題は数学的に抽象化することで簡単に解くことができます。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ll t;
cin >> t;
while (t--) {
ll n, sum = 0;
cin >> n;
vector<ll> arr(n);
for (auto &x : arr) {
cin >> x;
sum += x; ...
6月1日 19:15 投稿
競技プログラミング問題集 SMU Spring 2023
A. 重複要素の削除
与えられた数列から重複要素を削除し、最初に出現した要素のみを保持するアルゴリズム。
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
vector<int> removeDuplicates(const vector<int>& nums) {
unordered_map<int, int> countMap;
vector<int> result ...
5月29日 14:24 投稿
AtCoder Beginner Contest 389 解法解説
A - 9x9
問題概要
1桁の数字同士の乗算結果を求める。
解法
入力文字列から数値を抽出して掛け算する実装を行えばよい。
実装コード
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve() {
string input;
cin >> input;
int a = input[0] - '0';
...
5月28日 14:34 投稿
配列操作と木構造上の色付け問題の解法
配列内要素の隣接関係判定
与えられた配列において、特定の2つの要素xとyが隣接しているかどうかを判定する問題です。
#include<iostream>
#include<vector>
using namespace std;
bool checkAdjacent(vector<int>& arr, int target1, int target2) {
int n = arr.size();
for(int i = 0; i < n; i++) {
if(arr[i] == target1) {
...
5月26日 06:39 投稿
競技プログラミング問題集:幾何、貪欲法、データ構造
円の面積計算
円の面積を計算する際にはπの精度に注意が必要である。以下のコードは入力値nを用いて円の面積を計算する。ここで円の半径はnに関係する(n*n*0.5をπで割る)。
#include<iostream>
#include<cmath>
using namespace std;
int main() {
double input;
cin >> input;
double area = input * input * 0.5 / M_PI;
printf("% ...
5月23日 22:12 投稿
Codeforces ラウンド 970 (Div. 3)
A. サクラコの試験
解法
全探索で解く。
コード
#include <iostream>
using namespace std;
void solve() {
int a, b;
cin >> a >> b;
for (int i = 0; i n;
string s;
cin >> s;
int m = sqrt(n);
if (m * m != n) {
cout a >> b;
long long l = 1, r = 2e9, ans = 0;
while (l
5月22日 19:19 投稿
プレフィックス和と差分アルゴリズムの理解とC++実装
プレフィックス和アルゴリズム
基本概念
プレフィックス和は配列処理技術の一種で、事前計算により部分区間の和をO(1)で取得可能にします。入力配列をdataとすると、プレフィックス配列prefは次のように定義されます:
pref[i] = data[0] + data[1] + ... + data[i]
pref[0] = data[0]
構築方法
C++による実装例:
vector<int> constructPrefixArray(const vector& ...
5月21日 01:20 投稿
アルゴリズム競技プログラミング問題集
基本的なアルゴリズム問題集
1. 立方体の体積計算
辺の長さa, b, cが与えられた時、立方体の体積を計算します。
#include <iostream>
using namespace std;
int main() {
int length, width, height;
cin >> length >> width >> height;
cout > exponent;
cout countB;
for(int i=0; i<countA+countB; i++) {
cout > n;
whil ...
5月20日 03:45 投稿