Thứ Năm, 28 tháng 3, 2019

Bài B - Codeforces Round #518 (Div.2)

Bài B:
Đề bài: Ivan có một số b. Anh ấy sắp xếp các số a từ 1 đến 10^(18), với mỗi số a anh ấy viết $\frac{[a,b]}{a}$ lên bảng đen. Ở đây $[a,b]$ là bội chung nhỏ nhất của a và b. Ivan rất lười nhát, đó là lý do tại sao nhiệm vụ lần này làm phiền anh ấy. Nhưng anh ấy thú vị về việc đếm thử có bao nhiêu số khác nhau khi anh ấy viết lên bảng . Hãy giúp anh ấy xác định số lượng các số khác nhau mà anh ấy viết trên bảng.
Đầu vào:
+ Dòng đầu tiên chứa 1 số nguyên b(1<=b<=10^(10)).
Đầu ra:
+ In ra một số nguyên - là câu trả lời của vấn đề.
Ví dụ:
Đầu vào:
1
Đầu ra:
1
/**/
Đầu vào:
2
Đầu ra:
2.
Chú thích:
+ Ở ví dụ đầu tiên [a,1]=a, vì vậy [a,b]/a luôn bằng 1.
+ Ở ví dụ 2 [a,2]=a hoặc 2.a điều này phụ thuộc vào tính chẵn lẻ của a. do đó [a,b]/a bằng 1 hoặc 2.
Lời giải:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>

#define ll long long
//#define ull unsigned long long
#define BUG printf("************\n")
using namespace std;
ll gcd(ll a,ll b) {
    return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a,ll b) {
    return a / gcd(a, b) * b;
}
ll pow_mod(ll a, ll b, ll mod) {
    ll ans = 1;
    while (b) {
        if (b & 1)ans = (ans * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return ans % mod;
}
bool is_prime(ll n) {
    if (n == 1 || n == 2)return 1;
    for (int i = 2; i <= sqrt(n); ++i)
        if (n % i == 0)return 0;
    return 1;
}
const ll mod = 1e8 + 7;
const int maxn = 4e5 + 10;
const int maxm = 1e6 + 10;
const double eps = 1e-8;

int p[10001];
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    ll b;
    cin>>b;
    ll t=(ll)sqrt(b);
    ll n=b;
    int cnt=0;
    for(ll i=2;i<=t;++i){
        if(n%i==0){
            ++cnt;
            while(n%i==0){
                ++p[cnt];
                n/=i;
            }
        }
    }
    if(n!=1){
        p[++cnt]++;
    }
    ll ans=1;
    for(int i=1;i<=cnt;++i){
        ans*=(p[i]+1);
    }
    cout<<ans<<endl;
    return 0;
}

Không có nhận xét nào:

Đăng nhận xé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ị: + ...