#594(本部2)ラウンドCodeforces
A.整数点
問題の意味:数所与\(Y = X + Pの\ ) 及び(Y = -X + Qの\) \ それらの交差点を見つけるは、整数座標の数であります
アイデア:\(X + Y = P \)と\(Y = -X + q個の\ ) の交点の\(\左(\ FRAC { Q - P} {2}の\ FRAC {P + Q} {2 } \右)\)アレイにのみ奇数-偶数統計的p及びqに
ACコード
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 1e5 + 10;
int t, n, m;
ll cnt1, cnt2, cnt3, cnt4, ans;
ll p[N], q[N];
int main(){
// freopen("my_in.txt", "r", stdin);
// freopen("my_out.txt", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t -- ){
ans = 0, cnt1 = 0, cnt2 = 0, cnt3 = 0, cnt4 = 0;
cin >> n;
for (int i = 1; i <= n; i ++ ){
cin >> p[i];
if (p[i] & 1)
cnt1 ++ ;
else
cnt2 ++ ;
}
cin >> m;
for (int i = 1; i <= m; i ++ ){
cin >> q[i];
if (q[i] & 1)
cnt3 ++ ;
else
cnt4 ++ ;
}
ans = cnt1 * cnt3 + cnt2 * cnt4;
cout << ans << "\n";
}
return 0;
}
B.は、木を育て
問題の意味は:ポリライン項最長の距離の終点まで線の始点を構成する線分の長さを与えます
アイデア:ソート以前に必要な線分として前半\(X \)必要な半分の線分の投影軸後(Y \)\の軸は、投影線分の長さを求めるには、最大であります
ACコード
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 1e5 + 10;
int n;
int a[N];
ll x, y, ans;
int main(){
// freopen("my_in.txt", "r", stdin);
// freopen("my_out.txt", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> a[i];
sort(a + 1, a + n + 1);
for (int i = 1; i <= n / 2; i ++ )
x += a[i];
for (int i = n / 2 + 1; i <= n; i ++ )
y += a[i];
ans = x * x + y * y;
cout << ans << "\n";
return 0;
}
C.イワンフールと確率論
質問の意味:与えられた\(N * m個の\)など、多くの小さな格子グリッドにあらゆる小さい事を埋めるための四角形は、隣接するグリッドまで持つことができますが満たされているが、種法の合計数を記入するように求め
アイデア:
ACコード
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
int n, m;
ll ans;
ll f[N];
void init(){
f[1] = 1, f[2] = 2;
for (int i = 3; i < N; i ++ )
f[i] = (f[i - 1] + f[i - 2]) % mod;
}
int main(){
// freopen("my_in.txt", "r", stdin);
// freopen("my_out.txt", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
init();
cin >> n >> m;
ans = mult_mod(2, ((f[n] + f[m]) % mod - 1 + mod) % mod, mod);
cout << ans << "\n";
return 0;
}