Hiển thị các bài đăng có nhãn ontap_cf. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn ontap_cf. Hiển thị tất cả bài đăng

Chủ Nhật, 21 tháng 4, 2019

Bài G - Codeforces Round #552 (Div.3)

Đề bài: Cho một mảng a gồm n phần tử a(1),a(2),...,a(n). Tìm các cặp chỉ số (i,j) (1<=i<j<=n) thỏa mãn lcm(a(i),a(j)) nhỏ nhất có thể.
Đầu vào:
+ Dòng đầu tiên chứa số nguyên n (2<=n<=10^6). Số lượng phần tử của a.
+ Dòng thứ hai chứa n số nguyên a(1),a(2),...,a(n).
Đầu ra:
+ In ra hai số nguyên i,j (1<=i<j<=n) thỏa mãn lcm(a(i),a(j)) là nhỏ nhất trong số các cặp (i,j). Nếu có nhiều đáp án, in ra bất kỳ.
Ví dụ:
5
2 4 8 3 6
In ra: 1 2
Hướng dẫn:
Tôi đã nghe có rất nhiều solutions dễ với độ phức tạp O(alog(a)), với a là giá trị nhỏ nhất của a(i), nhưng tôi sẽ mô tả thuật toán với độ phức tạp O(nd), với d là số lượng ước lớn nhất của a(i).
Một cận trên tốt xấp xỉ số ước của x là $\sqrt[3]{x}$ vì vậy tôi làm việc với $O(n\sqrt[3]{x})$.
Đầu tiên, chúng ta hãy nói về ý tưởng của bài này. Ý tưởng chính là mỗi số chạy từ 1 đến 10^7, chúng ta muốn tìm hai số nhỏ nhất trong mảng mà chia hết cho số này. Sau đó chúng ta tìm câu trả lời trong số tất cả các ước này mà có ít nhất hai bội số trong mảng.
Chúng ta viết một hàm add(idx) cái mà chúng ta sẽ cố gắng thêm a(idx) đến tất cả các ước của nó. Cách dễ nhất để làm là lặp tất cả các ước với độ phức tạp O(can(idx)) và thêm nó bằng cách nào đó. Nhưng nó quá chậm. Chúng ta hãy cải tiến nó bằng một cách nào đó. Làm thế nào để chúng ta có thể bỏ qua các số không phải là ước của a(idx)? Chúng ta hãy xây dựng 1 sàn nguyên tố (Tôi rất khuyến khích với độ phức tạp O(n) vì sàn nguyên số với độ phức tạp O(nlog(n))) sẽ chậm đi gấp 2 lần), cái mà sẽ duy trì số ước tối thiểu với mỗi số từ 1 đến 10^7. Vì vậy chúng ta có thể phân tích thừa số nguyên tố với độ phức tạp (O(log(a(idx)))) và lặp tất cả các ước sử dụng đệ quy.
Và cuối cùng ta nên chú ý rằng - Lời giải này có thể TLE và yêu cầu chúng ta tối ưu hóa các ràng buộc. Tôi khuyên bạn nên sử dụng cặp số nguyên cho mỗi ước và thêm nó sử dụng một vài câu lệnh if.
Lời giải 1:
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000000+5;
long long int ans=0x3f3f3f3f3f3f3f3f;
int a[maxn],b[maxn];
int main ()
{
 int n,i,j,ansj,ansi,x;
 cin>>n;
 for(i=1;i<=n;i++){
  scanf("%d",&a[i]);
  if(b[a[i]]&&ans>a[i]) ans=a[i],ansi=i,ansj=b[a[i]];
  b[a[i]]=i;
 }
 for(i=1;i<maxn;i++)
 for(x=0,j=i;j<maxn;j+=i){
  if(b[j]){
   if(x==0) x=j;
   else{
    if(ans>1LL*x*j/i) ans=1LL*x*j/i,ansj=b[j],ansi=b[x];
   }
  }
 }
 if(ansi>ansj) swap(ansi,ansj);
 cout<<ansi<<' '<<ansj;
   return 0;
}
 
 
Lời giải 2:
#include <bits/stdc++.h>

using namespace std;

const int INF = 1e9;
const int N = 10 * 1000 * 1000 + 11;

int n;
vector<int> a;

int mind[N];

pair<int, int> mins[N];
vector<pair<int, int>> divs;

void build_sieve() {
 vector<int> pr;
 mind[0] = mind[1] = 1;
 for (int i = 2; i < N; ++i) {
  if (mind[i] == 0) {
   pr.push_back(i);
   mind[i] = i;
  }
  for (int j = 0; j < int(pr.size()) && pr[j] <= mind[i] && i * pr[j] < N; ++j) {
   mind[i * pr[j]] = pr[j];
  }
 }
}


void add_to_mins(int curd, int idx) {
    if(mins[curd].first == -1)
        mins[curd].first = idx;
    else if(mins[curd].second == -1)
        mins[curd].second = idx;
}

void rec(int pos, int curd, int idx) {
 if (pos == int(divs.size())) {
  add_to_mins(curd, idx);
  return;
 }
 int curm = 1;
 for (int i = 0; i <= divs[pos].second; ++i) {
  rec(pos + 1, curd * curm, idx);
  curm *= divs[pos].first;
 }
}

void add(int idx) {
 int value = a[idx];
 divs.clear();
 while (value > 1) {
  int d = mind[value];
  if (!divs.empty() && divs.back().first == d) {
   ++divs.back().second;
  } else {
   divs.push_back(make_pair(d, 1));
  }
  value /= d;
 }
 rec(0, 1, idx);
}

int main() {
#ifdef _DEBUG
 freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
 
 cin >> n;
 a.resize(n);
 for (int i = 0; i < n; ++i) {
  cin >> a[i];
 }
 for(int i = 0; i < N; i++)
     mins[i] = make_pair(-1, -1);
 build_sieve();
 
 vector<pair<int, int> > vals;
 for(int i = 0; i < n; i++)
     vals.push_back(make_pair(a[i], i));
 sort(vals.begin(), vals.end());
 for (int i = 0; i < n; ++i) {
     if(i > 1 && vals[i].first == vals[i - 2].first) continue;
  add(vals[i].second);
 }
 
 long long l = INF * 1ll * INF;
 int ansi = -1, ansj = -1;
 for (int i = 1; i < N; ++i) {
  pair<int, int> idxs = mins[i];
  if (idxs.second == -1) continue;
  long long curl = a[idxs.first] * 1ll * a[idxs.second] / i;
  if (l > curl) {
   l = curl;
   ansi = min(idxs.first, idxs.second);
   ansj = max(idxs.first, idxs.second);
  }
 }
 
 cout << ansi + 1 << " " << ansj + 1 << endl;
 
 return 0;
}
 
 

Thứ Hai, 1 tháng 4, 2019

Bài A - Codeforces Beta Round #72 (Div.1 Only)

Valera rất quan tâm đến phép thuật. Phép thuật thu hút anh ta đến mức anh ta nhìn thấy nó ở khắp mọi nơi. Ông giải thích bất kỳ hiện tượng kỳ lạ và kỳ lạ nào thông qua sự can thiệp của các thế lực siêu nhiên.
   Valera hoàn toán vô tình có được một mảnh giấy da cổ, trên đó có một dãy số được viết. Anh ta nghĩ rằng những con số trong mảng này không phải là ngẫu nhiên. Kết quả của nghiên cứu sâu rộng Valera đã tìm ra một tính chất tuyệt vời mà một mảng ma thuật nên có: có một mảng được định nghĩa là ma thuật nếu tối  thiểu và tối đa trùng khớp.
 Anh ấy quyết định chia sẻ khám phá nổi bật với bạn, nhưng anh ấy nhờ bạn giúp đỡ để đáp lại. Mặc dù có trí thông minh và trí thông minh to lớn, Valera tính rất tệ và vì vậy bạn sẽ phải hoàn thành công việc của mình. Tất cả những gì bạn phải làm là đếm số lượng các phép thuật con của mảng số gốc, được viết trên giấy da. Subarray được định nghĩa là chuỗi không trống của các phần tử liên tiếp.
Đầu vào:
+ Dòng đầu tiên chứa số nguyên n (1<=n<=10^5). Dòng thứ hai chứa một mảng các số nguyên a(1),a(2),...,a(n).
Đầu ra:
+ In ra một dòng duy nhất là câu trả lời của bài toán: số lượng mảng con, thỏa mãn mảng đó là ma thuật.
Ví dụ:
Đầu vào:
4
2 1 1 4
Đầu ra:
5
Đầu vào:
5
-2 -2 -2 0 1
Đầu ra:
8
Giải thích:
Ở ví dụ đầu tiên: [1;1],[2;2],[3;3],[4;4],[2;3]
Ở ví dụ thứ hai: [1;1],[2;2],[3;3],[4;4],[5;5],[1,2],[2,3],[1,3].
Hướng dẫn:
Lời giải:
#include<iostream>
long long n,S,r,p=2e9,x;
main(){
  for(std::cin>>n;std::cin>>x;S+=++r)if(x!=p)r=0,p=x;
  std::cout<<S;
}


Chủ Nhật, 31 tháng 3, 2019

Bài C - Codeforces Beta Round #1

Bài C:
Đề bài:
  Ngày nay tất cả các rạp xiếc ở Berland đều có một đấu trường với đường kính 13 mét, nhưng trong mọi thứ thì khác.
  Trong các đấu trường Berland cổ đại trong các rạp xiếc được định hình là một đa giác (tam giác) đều, kích thước và số lượng góc có thể thay đổi tử rạp xiếc này đến rạp xiếc khác. Ở mỗi góc của đấu trường có một cây cột đặc biệt, và sợi dây được căng giữa các cây cột đánh dấu các cạnh của đấu trường.
  Gần đây, các nhà khoa học từ Berland đã phát hiện ra phần còn lại của đấu trường xiếc cổ đại. Họ chỉ tìm thấy ba cây cột, những cái khác đã bị thời gian pháy hủy.
  Bạn được cho các tọa độ của ba cây trụ. Tìm ra giá trị nhỏ nhất của đấu trường có thể.
Đầu vào:
+ Đầu vào gồm 3 dòng, mỗi dòng là một cặp số - tọa độ của các cột. Bất kì tọa độ nào cũng không quá 1000 by absolute value, và được cho nhiều nhất 6 chữ số sau hàng thập phân.
Đầu ra:
+ In ra diện tích nhỏ nhất có thể của đầu trường cổ. Con số này chính xác tới ít nhất 6 số phần thập phân.
Ví dụ:
Đầu vào:
0.000000 0.000000
1.000000 1.000000
0.000000 1.000000
Đầu ra:
1.00000000
Hướng dẫn:
 Các điểm có thể là các đỉnh của N- đa giác đều khi và chỉ khi với mỗi cặp, sự khác biệt của các góc cực của chúng (khi nhìn từ tâm đa giác) của 2*pi/N. Tất cả các điểm nằm trên đường tròn với cùng tâm với đa giác. Chúng ta có thể xác định vị trí trung tâm của đa giác / vòng tròn [nhưng chúng ta có thể tránh điều này, vì một hợp âm như giả sử, (x(1),y(1))-(x(2),y(2))] được nhìn thấy ở góc lớn hơn gấp đôi so với tâm điểm khác của một điểm khác của đường tròn (x(3),y(3))]
 Có nhiều cách để xác định vị trí trung tâm của vòng tròn, cách tôi đã xây dựng là xây dựng trung điểm vuông góc với các phân đoạn (x1,y1)-(x2,y2) và (x2,y2)-(x3,y3) ở dạng y=a*x+b và tìm giao điểm của chúng. Công thức y=a*x+b có nhược điểm là không thể sử dụng nếu đường thẳng song song với y, cách giải quyết có thể là xoay tất cả các điểm theo góc ngẫu nhiên (sử dụng công thức xl=x*cos(a)-y*sin(a),y'=y*cos(a)+x*sin(a)) cho đến khi không có đoạn nào nằm ngang (và do đó không có đường vuông góc nào là dọc).
  Sau khi biết tọa độ của tâm, chúng ta sử dụng hàm ưa thích: , trả về góc trong phần tư phải: a[i]=atan2(y[i]-ycenter,x[i]-xcenter) atan2.
  Diện tích của đa giác đều tăng khi tăng N, do đó có thể chỉ cần lặp qua tất cả các giá trị có thể có trên N theo thứ tự tăng dần và thoát khỏi chu kỳ khi tìm thấy N thỏa mãn đầu tiên.
 Sử dụng sin(x) là làm cho nó dễ dàng: sin(x)=0 khi x là bội của pi. Vì vậy, đối với các điểm thuộc về đa giác N, đa giác N đều.
sin(N*(a[i]-a[j])/2)=0.
 Bởi vì số học chính xác hữu hạn, fabs(sin(N*(a[i]-a[j])/2)).
Lời giải:
#include<cstdio>
#include<cmath>
#define D double
#define S(x) ((x)*(x))
#define G(t) a[t]=x[t]-x[2];b[t]=y[t]-y[2];c[t]=(S(x[t])+S(y[t])-S(x[2])-S(y[2]))/2;
#define M(p,q) (p[0]*q[1]-p[1]*q[0])
D g(D a,D b){return fabs(b)<1e-4?a:g(b,fmod(a,b));}
D x[3],y[3],a[3],b[2],c[2],A,X,Y;
int main()
{
for(int i=0;i<3;++i)scanf("%lf%lf",x+i,y+i);
G(0);G(1);
X=M(c,b)/M(a,b);
Y=M(a,c)/M(a,b);
for(int i=0;i<3;++i)a[i]=atan2(x[i]-=X,y[i]-=Y);
A=g(M_PI*2,g(fabs(a[1]-a[0]),fabs(a[2]-a[0])));
printf("%lf\n",(S(x[0])+S(y[0]))*sin(A)*M_PI/A);
}

Thứ Sáu, 29 tháng 3, 2019

Bài E - Codeforces Round 62 (Div.2)

Bài E:
Đề bài: Chúng ta kí hiệu rằng một mảng b nào đó là tồi tệ nếu nó chứa một mảng con b(l),b(l+1),...,b(r) với độ dài lẻ và lớn hơn 1 (l<r và r-l+1 là số lẻ) thỏa mãn $\forall i\in \left\{0,1,...,r-l\right\} b_{l+i}=b_{r-i}$.
Nếu một mảng không xấu, thì đó mảng tốt.
Bây giờ bạn được cho một mảng a(1),a(2),...,a(n). Một vài phần tử được thay thế bằng -1. Tính số mảng tốt bạn có thể đạt được bằng cách thay mỗi số -1 bằng 1 số nguyên nào đó từ 1 đến k.
Bởi vì câu trả lời có thể rất lớn, in ra nó modulo 998244353
Đầu vào:
+ Dòng đầu tiên chứa hai số nguyên n và k (2<=n,k<=2.10^5) - chiều dài của mảng a và kích thước của "alphabet"
+ Dòng thứ 2 chứa n số nguyên a(1),a(2),...,a(n) (a(i)=-1 hoặc 1<=a(i)<=k)- mảng a.
Đầu ra:
In ra một số nguyên - số mảng tốt bạn có thể đạt được , modulo 998244353.
Ví dụ:
Đầu vào:
2 3
-1 -1
Đầu ra:
9
/**/
Đầu vào:
5 2
1 -1 -1 1 2
Đầu ra:
0
/**/
Đầu vào:
5 3
1 -1 -1 1 2
Đầu ra: 2
/**/
Đầu vào:
4 200000
-1 -1 12345 -1
Đầu ra:
735945883.
Hướng dẫn:
 Đầu tiên, mảng chứa một mảng con đối xứng >=3 tương đương với mảng chứa một mảng con đối xứng có độ dài là 3.
Vì vậy, chúng ta cần tính số mảng mà không đối xứng có độ dài là 3. Điều này tương đương với mảng mà a[i]#a[i+2] với mọi i hợp lý.
Chú ý ràng, i và i+2 có cùng tính chẵn lẽ, vì vậy tất cả vị trí lẻ và vị trí chẵn trong mảng độc lập nhau, và câu trả lời là tích các cách chọn các số ở vị trí lẻ, và số cách chọn các số ở vị trí chẵn.
Về mặt tương đương hình thái điều kiện, a[i]#a[i+1] và chúng ta cần tính tất cả các cách để thay các số -1 bằng một cách nào đó các cặp phần tử liên tiếp là khác nhau.
  Để tính nó, chúng ta hãy nhìn vào chuỗi các số (-1) liên tiếp. Họ sẽ thấy rằng a,-1,-1,...,-1,b với l số (-1), ở đây a và b là các số nguyên dương (trường hợp a ở đây không có thể xét như k.(a,-1,-1,...,b với l-1 số -1)), trường hợp b rỗng được giải theo cách tương tự.
  Cuối cùng chúng ta cần tính số các dãy như vậy. Có hai loại dãy chúng ta cần xét tới đó là a,-1,..,-1,a (đầu và cuối giống nhau) và a,-1,-1,...,-1,b (đầu và cuối khác nhau). Giá trị chính xác của a và b không phải là vấn đề.
  Chúng ta sẽ tìm hai giá trị (đặt tên chúng là cntSame và cntDiff) với l số (-1) liên tiếp với thời gian O(log(l)). Các giá trị cơ sở: cntSame(0)=0,cntDiff(0)=1.
  Chúng ta thử chọn giá trị của -1 nằm ở giữa của dãy : Nếu l mod 2=1, thì chúng ta có thể tách thành hai dãy có độ dài [l/2] và cntSame(l)=cntSame(l/2)^2+(k-1).cntDiff(l/2)^2 và cntDiff(l)=2.cntSame(l/2).cntDiff(l/2)+(k-2).cntDiff(l/2)^2.
Nếu l mod 2= 1thì chỉ cần lặp giá trị cuối cùng -1m thì cntSame(l)=(k-1).cntDiff(l-1) và cntDiff(l)=cntSame(l-1)+(k-2).cntDiff(l-1).
Độ phức tạp cuối cùng là O(n).
Lời giải:
#include<bits/stdc++.h>

using namespace std;

#define fore(i, l, r) for(int i = int(l); i < int(r); i++)
#define sz(a) int((a).size())

#define x first
#define y second

typedef long long li;
typedef pair<int, int> pt;

const int MOD = 998244353;
int norm(int a) {
    while(a >= MOD) a -= MOD;
    while(a < 0) a += MOD;
    return a;
}
int mul(int a, int b) {
    return int(a * 1ll * b % MOD);
}

int n, k;
vector<int> a;

inline bool read() {
    if(!(cin >> n >> k))
        return false;
    a.resize(n);
    fore(i, 0, n)
        cin >> a[i];
    return true;
}

pair<int, int> calc(int len) {
    if(len == 0) return {0, 1};
    if(len & 1) {
        auto res = calc(len >> 1);
        return {norm(mul(res.x, res.x) + mul(k - 1, mul(res.y, res.y))),
                norm(mul(2, mul(res.x, res.y)) + mul(k - 2, mul(res.y, res.y)))};
    }
    auto res = calc(len - 1);
    return {mul(k - 1, res.y), norm(res.x + mul(k - 2, res.y))};
}

vector<int> curArray;

int calcSeg(int l, int r) {
    if(r >= sz(curArray)) {
        int len = r - l - 1, cf = 1;
        if(l < 0)
            len--, cf = k;
        if(len == 0) return cf;

        auto res = calc(len - 1);
        return mul(cf, norm(res.x + mul(k - 1, res.y)));
    }
    if(l < 0) {
        if(r - l == 1) return 1;
        auto res = calc(r - l - 2);
        return norm(res.x + mul(k - 1, res.y));
    }
    auto res = calc(r - l - 1);
    return curArray[l] == curArray[r] ? res.x : res.y;
}

inline void solve() {
    int ans = 1;
    fore(k, 0, 2) {
        curArray.clear();
        for(int i = 0; 2 * i + k < n; i++)
            curArray.push_back(a[2 * i + k]);

        int lst = -1;
        fore(i, 0, sz(curArray)){
            if(curArray[i] == -1) continue;
            ans = mul(ans, calcSeg(lst, i));
            lst = i;
        }
        ans = mul(ans, calcSeg(lst, sz(curArray)));
    }
    cout << ans << endl;
}

int main() {
#ifdef _DEBUG
    freopen("input.txt", "r", stdin);
    int tt = clock();
#endif
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cout << fixed << setprecision(15);

    if(read()) {
        solve();

#ifdef _DEBUG
        cerr << "TIME = " << clock() - tt << endl;
        tt = clock();
#endif
    }
    return 0;
}


Bài C - Google Bye 2018

Bài C:
Đề bài: Cho n người ngồi theo 1 vòng tròn, được đánh số từ 1 đến n. Có nghĩa là, với mọi i chạy từ 1 đến n-1, thì người có chỉ số i và i+1 ngồi kề nhau. Người thứ n và người thứ 1 cũng ngồi kề nhau.
Người với chỉ số là 1 ban đầu có 1 trái bóng. Anh ta lấy một số nguyên k (k<=n), và chuyền trái banh này đến người hàng xóm thứ k của anh ta theo chiều tăng dần của các chỉ số, người đó chuyền bóng cho người hàng xóm thứ k của mình theo cùng hướng, và cứ thế cho đến khi người với chỉ số 1 nhận được bóng. Khi anh ta nhận được bóng, mọi người sẽ không chuyền bóng nữa.
Ví dụ, nếu n=6 và k=4, thì quả bóng sẽ được chuyển theo thứ tự [1,5,3,1].
 Xét tập tất cả các người mà chạm vào quả bóng. Độ vui của game là tổng các chỉ số của người mà chạm vào quả bóng. Ở trường hợp trên, độ vui của game là 1+5+3=9.
Tìm và báo cáo tập các giá trị vui có thể cho tất cả các lựa chọn số nguyên dương k. Có thể chỉ ra ràng buộc của vấn đề quả bóng cuối cùng luôn ở trong tạy người thứ 1 sau nhiều bước chuyền bóng chính xác và không có quá 105 giá trị vui có thể của n.
Đầu vào:
+ Dòng đầu tiên chứa số nguyên n (2<=n<=10^9) - số lượng người chơi bóng.
Đầu ra:
+ Giả sử ta có một tập các giá trị vui là f(1),f(2),....,f(m)
+ In ra một 1 dòng duy nhất chứa m số từ f(1) đến f(m) theo thứ tự tăng dần.
Ví dụ:
Đầu vào:
6
Đầu ra:
1 5 9 21
Đầu vào:
16
Đầu ra:
1 10 28 64 136
Chú thích:
Ở ví dụ đầu tiên, chúng ta đã có sẵn với k=4, chúng ta được giá trị vui vẻ là 9, cũng như với k=2. Với k=6, ta được giá trị vui vẻ là 1. Ứng với k=3, ta được giá trị vui vẻ là 5, và ứng với k=1 hoặc 5, giá trị vui vẻ là 21.

Ở ví dụ 2, các giá trị 1,10,28,64 và 136 đạt được là với k=16,8,4,10 và 11 lần lượt.
Hướng dẫn:
 Trừ 1 từ tất cả các giá trị cho tiện. Điều chỉnh giá trị k. Chúng ta được các giá trị a.k mod n với a từ 0 cho đến đạt 0 lại. Giá trị này có thể được viết a.k-b.n. Theo định lý Bezout, phương trình a.k-b.n=c có nghiệm cho a và b khi và chỉ khi c chia hết cho gcd(k,n).
Hơn thế nữa, tất cả các giá trị của c sẽ được duyệt qua trước khi nó quay về 0. Ở đây, bởi vì phần từ k/gcd(k,n) sinh ra nhóm $\mathbb{Z}_{n/gcd(k,n)}$.
Chúng ta có thể xét các giá trị k là ước của n. Chúng ta có thể tìm tất cả chúng bằng độ phức tạp $O(\sqrt{n})$. Với mỗi trong số chúng, chúng ta có thể tìm một giải pháp dạng đóng bằng cách tổng hợp chuỗi số học.
Lời giải:
#include <bits/stdc++.h>
using namespace std;

int main()
{
 long long n,i,x;
 cin>>n;
 set<long long> a;
 for(i=1;i*i<=n;i++){
  if(n%i) continue;
  x=n/i;
  a.insert((1+n-i+1)*x/2);
  a.insert((1+n-x+1)*i/2);
 }
 for(auto it:a) printf("%lld\n",it);
 return 0;
}


Bài C - Codeforces Beta Round #10

Bài C:
Đề bài: Cách đây không lâu, Billy bắt gặp một vấn đề, đó là: cho ba số tự nhiên A,B và C thuộc dãy [1..N], và chúng ta phải kiểm tra liệu rằng phương trình AB=C có đúng hay không?. Gần đây, Billy đã học về khái niệm digital root của 1 số. Chúng tôi nên nhắc lại rằng digital root d(x) của một số x là tổng s(x) của tất cả các chữ số, nếu s(x)<=9, ngược lại nó là d(s(x)). Ví một, digital root của số 6543 được tính như sau: d(6543)=d(6+5+4+3)=d(18)=d(9). Billy phải điểm rằng digital root của một tích các số có bằng digital root của tích các digital root các số, nghĩa là d(xy)=d(d(x).d(y)). Và lời giải dưới đây có ảnh hưởng đến tâm trí của anh ấy: để tính digital root và kiểm tra rằng điều kiện này đã đáp ứng chưa. Tuy nhiên, Billy nghi ngờ rằng điều kiện này đã đủ chưa. Và đó là lý do anh ta hỏi bạn để tìm ra nhiều ví dụ cho vấn đề được cho này thỏa mãn thuật toán được đề nghị bởi Billy có lỗi.
Đầu vào:
+ Dòng đầu tiên chứa 1 số duy nhất N (1<=N<=10^6).
Đầu ra:
+ In ra 1 số - số lượng các số A,B và C được yêu cầu từ dãy [1..N]
Ví dụ:
Đầu vào:
4
Đầu ra:
2
/**/
Đầu vào:
5
Đầu ra:
6
Chú thích
Ở ví dụ đầu tiên ta có bộ ba (3,4,3) và (4,3,3)
Lời giải:
#include<iostream>
int n,i,j;
__int64 t,a[9];
int main()
{
 std::cin>>n;
 for(i=1;i<=n;i++)a[i%9]++,t-=n/i;
 for(i=0;i<9;i++)for(j=0;j<9;j++)t+=a[i]*a[j]*a[i*j%9];
 std::cout<<t;
}

Bài G - Educatioal Round 62

Đề bài: Bạn được cho 1 đồ thị vô hướng đặc biệt. Nó bao gồm $2n$ đỉnh được đánh số từ 1 đến 2n. Dưới đây là một số đặc tính của đồ thị: + ...