題目鏈接:http://codeforces.com/contest/1422
A題
簽到題
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll MODE = 1e9 + 7; string s; int main () { cin >> s; ll n = s.size(); ll temp = 0; for(int i = 0; i < n; ++i) { temp += s[i] - '0'; } ll po = 1; ll sum = 0; for(ll i = n - 1; i >= 0; --i) { ll x =s[i] - '0'; temp -= x; sum += temp * (n - i) % MODE * po % MODE; //之后 sum += x * i * (i + 1) / 2 % MODE * po % MODE; //算上這位 sum %= MODE; po *= 10; po %= MODE; } cout << sum << endl; }
B題
思維題
對稱四元組全部變成四個中第二大的數
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll get(ll a, ll b,ll c, ll d) { vector<ll> v(4); v[0] = a; v[1] = b; v[2] = c; v[3] = d; sort(v.begin(), v.end()); return v[1]; } int main () { int t; cin >> t; while(t--) { ll v[110][110]; int n, m; cin >> n >> m; ll sum = 0; for(int i = 0; i < n; ++i) { for(int j = 0; j < m; ++j) { cin >> v[i][j]; } } for(int i = 0; i < n; ++i) { for(int j = 0; j < m; ++j) { sum += abs(v[i][j] - get(v[i][j], v[n - 1 - i][j], v[i][m - 1 - j], v[n - 1 -i][m - 1 - j])); } } cout << sum << endl; } }
C題
數論題
有點兒靈性得看出每一位對於答案的貢獻
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll MODE = 1e9 + 7; string s; int main () { cin >> s; ll n = s.size(); ll temp = 0; for(int i = 0; i < n; ++i) { temp += s[i] - '0'; } ll po = 1; ll sum = 0; for(ll i = n - 1; i >= 0; --i) { ll x =s[i] - '0'; temp -= x; sum += temp * (n - i) % MODE * po % MODE; //temp代表的是x之前所有數的和,乘以po之后代表,對於其的貢獻 sum += x * i * (i + 1) / 2 % MODE * po % MODE; //i(i+1)/2是求和。代表的是x選擇后左邊不同位數可以選擇的情況總數 sum %= MODE; po *= 10; po %= MODE; } cout << sum << endl; }