Hiển thị các bài đăng có nhãn Toán. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Toán. Hiển thị tất cả bài đăng
P177PROA - ROUND 7A - Một cái đinh rỉ !

P177PROA - ROUND 7A - Một cái đinh rỉ !

Link Sub: https://www.spoj.com/PTIT/problems/P177PROA/
Người Gửi: Dương Lee

  • Problem:

Lúa rất thích Lều, nhưng Lều không muốn xao nhãng việc học. Biết Lúa rất dốt toán, nhất là hình học nên Lều ra cho Lúa một bài toán và nếu Lúa không giải được thì sẽ cho Lúa một cơ hội.  
Lều cho Lúa một hình tròn có bán kính r, tâm của nó được đặt ở tọa độ x0, y0, và một chiếc đinh rỉ. 
Và yêu cầu phải đưa tâm hình tròn đến tọa độ x1,y1.  Biết rằng : Lúa chỉ được di chuyển hình tròn bằng cách cắm chiếc đinh vào mép của hình tròn và xoay hình tròn, và Lúa phải thực hiện với số lần cắm đinh ít nhất.  
Đương nhiên làm sai là chuyện đơn giản, “nhưng hôm nay là cá tháng Tư nên chắc Lều đang nói ngược thôi -_- “ . Hãy giúp Lúa giải bài toán này nhé.
Input
Một dòng duy nhất 5 số nguyên r,x0,y0,x1,y1. (1 ≤ r ≤ 105,  - 105 ≤ x, y, x', y' ≤ 105)
Output
In ra một số nguyên là số lần cắm đinh ít nhất để hoàn thành yêu cầu
Example:
Input
2 0 0 4 0
Output:
1

Input
4 1 2 1 2
Output:
0
Giải thích : Test 2 0 0 4 0
Như hình dưới : sẽ chỉ cần một lần cắm đinh và xoay.
Output:
  • Solution:

Hix, cứ trâu thui bạn :(

  • Code:

C++:

#include <iostream>
#include <math.h>
using namespace std;
 
int main ()
{
    long long r, x0, y0, x1, y1;
    cin>>r>>x0>>y0>>x1>>y1;
    long long d = (x1-x0)*(x1-x0) + (y1-y0)*(y1-y0);
    double k=sqrt(d);
 
    if (x1==x0 && y1==y0)
    {
        cout<<"0";
    }
    else
    {
        if ((k/2)<=r)
            cout<<"1";
        else
        {
            long long dem=0;
            do
            {
                k=k-(double)(r*2);
                dem++;
           }
            while (k/2>r);    		
            
            cout<<dem+1;	
    	}	
    }
    return 0;
}

JAVA:

...

Python:

...
P164PROG - ROUND 4G - Kim tự tháp

P164PROG - ROUND 4G - Kim tự tháp

Link Sub: https://www.spoj.com/PTIT/problems/P164PROG/
Người Gửi: Dương Lee

  • Problem:

LB có n khối hộp lập phương và anh ta quyết định xếp nó thành hình kim tự tháp. Kim tự tháp tầng trên cùng có 1 khối, tầng thứ 2 có 1 + 2 = 3 khối, tầng thứ 3 có 1 + 2 + 3 = 6 khối, cứ như vậy cho các đỉnh ở dưới. LB muốn xác định với n khối hộp, chiều cao tối đa của kim tự tháp là bao nhiêu?
Input
Một dòng chứa số n ( 1 <= n <= 10^4).
Output
Đáp án của bài toán.
Example:
Input
1
Output:
1

Input
25
Output:
4
  • Solution:

Bài này while cộng dồn cho đến khi đủ là ok ^^

  • Code:

C++:

https://ideone.com/ZkdEQx
#include <iostream>
using namespace std;
 
int main ()
{
    int n;
    cin>>n;
    int s=0;
    int t=0;
    int bs=0;
    while (s<n)
    {
        t++;
        bs=bs+t;
        s=s+bs;
    }
    if (s==n)
        cout<<t;
    else if (s>n)
        cout<<(t-1);
        
    return 0;
}

JAVA:

...

Python:

...
 P176PROG - ROUND 6G - Số phần tử khác nhau

P176PROG - ROUND 6G - Số phần tử khác nhau

Link Sub: https://www.spoj.com/PTIT/problems/P176PROG/
Người Gửi: Dương Lee

  • Problem:

Cho 4 số tự nhiên n, x, y, z (y < z).
Dãy số a được tạo ra như sau:
a[1] = x % z;
for (int i = 2; i <= n; i++)
    a[i] = (a[i – 1] + y) % z;
Hãy đếm số phần tử khác nhau của dãy số a.
Input
gồm 1 dòng chứa 4 số tự nhiên n, x, y, z (1 <= x, y, z <= 109; 1 <= n <= 108).
Output
1 số tự nhiên duy nhất là số phần tử khác nhau của dãy số a
Example:
Input
5 1 3 5
Output:
5

  • Solution:

Hack :v

  • Code:

C++:

https://ideone.com/461bZq
#include <iostream>
using namespace std;
 
int main ()
{
    long long n, x, y, z;
    cin>>n>>x>>y>>z;
    
    long long tg=z;
    while(y!=z)
    {
        if(y>z)
            y=y-z;
        else
            z=z-y;
    }
    
    if (tg/y<n) cout<<(tg/y);
    else cout<<n;
    return 0;
}

JAVA:

...

Python:

...
P152PROA - ROUND 2A - Nguyên tố cùng nhau

P152PROA - ROUND 2A - Nguyên tố cùng nhau

Link Sub: https://www.spoj.com/PTIT/problems/P152PROA/
Người Gửi: Dương Lee

  • Problem:

Juggernaut được cô giáo Disruptor dạy toán, cô giáo định nghĩa một hàm f(x) như sau:  
Với  t là số lượng các số tự nhiên k (1 <= k <= x) thỏa mãn nguyên tố cùng nhau với x, nếu t là nguyên tố thì f(x) = 1, ngược lại f(x) = 0.  
Disruptor cho Juggernaut một số nguyên dương x, yêu cầu anh cho biết giá trị của hàm f(x), nếu trả lời sai thì Jug sẽ bị  cô trả về nhà, Jug không muốn về nhà, các bạn hãy giúp Jug giải bài toán này.
Input
Dòng đầu tiên chứa số bộ test T (T <= 10).  
Mỗi test gồm một dòng chứa số x (1 <= x <= 10^5).
Output
In ra kết quả mỗi test trên một dòng là giá trị của hàm f(x).
Example:
Input
2
2
3
Output:
0
1

  • Solution:

- Không biết có cách làm toán cao cấp gì không nhưng mình làm theo đề bài với độ phức tạp O(NlogN) vẫn ok.
- Tìm số nguyên tố cùng nhau (là hai số có ước chung lớn nhất = 1) bằng phương pháp Euclid.
- Sau khi đếm số nguyên tố cùng nhau rồi thì ta tiến hành kiểm tra số nguyên tố và đưa ra kết quả f(x).

  • Code:

C++:

https://ideone.com/n70HhO
#include <iostream>
#include <math.h>
using namespace std;

int ucln(int a, int b)
{
    while (b!=0)
    {
        int x = a%b;
        a = b;
        b = x;
    }
    return a;
}

int snt(int x)
{
    if (x<2)
        return 0;
    for (int i=2; i<=sqrt(x); i++)
        if (x%i==0)
            return 0;
    return 1;
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int x;
        cin>>x;
        int d = 0;
        for (int i=1; i<=x; i++)
        {
            if (ucln(i, x)==1)
                d++;
        }
        if (snt(d)==1)
            cout<<"1"<<endl;
        else
            cout<<"0"<<endl;
    }
    return 0;
}

JAVA:

...

Python:

...
ALGOPRO8 - Đếm giày

ALGOPRO8 - Đếm giày

Link Sub: https://www.spoj.com/PTIT/problems/ALGOPRO8/
Người Gửi: Dương Lee

  • Problem:

Một ngày Gấu muốn đếm lại xem hiện tại mình đang có bao nhiêu đôi giày. Sau khi kiểm tra, Gấu có n chiếc giày màu đỏ và m chiếc giày màu xanh.  
Hiện tại Gấu đang theo mốt là mỗi ngày, gấu đeo một chiếc giày màu đỏ sang bên chân trái, chân phải thì đeo chiếc giày màu xanh. Gấu ngại giặt giày nên sau mỗi ngày, Gấu không đeo lại giày mà hôm đó đã dùng. Các bạn giúp Gấu xem là Gấu theo mốt này được bao nhiêu lâu. Sau đó, khi không thực hiện mốt này được nữa thì Gấu sẽ đeo 2 đôi giày cùng màu thì Gấu sẽ có giày đeo được bao nhiêu ngày tiếp theo.
Input
Một dòng duy nhất chứa 2 số nguyên n, m (1 <= n, m <= 100) là số lượng giày màu đỏ và số lượng giày màu xanh.
Output
Gồm 2 số nguyên lần lượt là số ngày Gấu đi mỗi bên một màu và số ngày tiếp theo Gấu đi 2 bên màu giống nhau.
Example:
Input
3 1
Output:
1 1

Input
2 3
Output:
2 0
Input
7 3
Output:
3 2
  • Solution:

Bài này chắc không có gì khó khăn.
- Số đôi đi cọc cạch = min(n, m)

- Số đôi đi đi là một đôi = (max(n, m) - min(n, m))/2

  • Code:

C++:

https://ideone.com/c3z6Be
#include <iostream>
using namespace std;

int main()
{
    int n, m;
    cin>>n>>m;
    int model = min(n, m);
    cout<<model<<" "<<(max(n, m) - model)/2;
    return 0;
}

JAVA:

...

Python:

...
BCPOW - Lũy thừa

BCPOW - Lũy thừa

Link Sub: https://www.spoj.com/PTIT/problems/BCPOW/
Người Gửi: Dương Lee

  • Problem:

Cho hai số n, m nguyên dương (n,m<=200). Hỏi trong biểu diễn thập phân của tổng  S=2n+3m chữ số  Cho hai số n, m nguyên dương (n,m<=200). Hỏi trong biểu diễn thập phân của tổng  S=2^n+3^m chữ số đầu tiên là chữ số nào? 
Ví dụ : 
với n=4 , m=2 thì S=25 có chữ số đầu tiên là 2. 
Với n=8, m=4 thì s=337 có chữ số đầu là 3. 
Input
Dữ liệu vào gồm một dòng duy nhất ghi 2 số n, m cách nhau bởi dấu cách.
Output
Một số duy nhất là đáp số của bài toán.
Example:
Input
4 2
Output:
2

Input
8 4
Output:
3
  • Solution:

- n, m <= 200 nên sẽ phải dùng số nguyên lớn để xử lý (cộng string)
- Code dưới đây chia làm 2 phần: Công số nguyên lớn và Lũy thừa số nguyên lớn.
+ Cong: Để cộng hai string như một số thì ta phải quy nó về cùng chiều dài số lơn nhất, sau đó áp dụng quy tắt cộng và nhớ số từ cuối lên đầu.
VD:
a = "123"
b = "4567"
->
a = "0123"
b = "4567"
<- "+", rs = "" , remember = 0
3 + 7 + 0 = 10 -> rs =    "0"  remember = 1
2 + 6 + 1 =  9 -> rs =   "90"  remember = 0
1 + 5 + 0 =  6 -> rs =  "690"  remember = 0
0 + 4 + 0 =  4 -> rs = "4690"  remember = 0
+ Luythua: đối với luy thừa thì thực chất ta cộng nhiều số lại với nhau thôi.
VD: 2^3 = 2*2*2
-> rs = "2"
rs = rs*2
-> rs = Cong(rs, rs) = 4
rs = rs*2
-> rs = Cong(rs, rs) = 8

  • Code:

C++:

https://ideone.com/fYJSFb
#include <iostream>
#include <math.h>
using namespace std;

string Cong(string a, string b)
{
    int len = max(a.length(), b.length());
    while (a.length()<len)
        a="0"+a;
    while (b.length()<len)
        b="0"+b;
    /*
    a = 123
    b = 4567
    ->
    a = 0123
    b = 4567
    */
    string rs = "";
    int remember = 0;
    for (int i=len-1; i>=0; i--)
    {
        int n1 = a[i]-'0';
        int n2 = b[i]-'0';
        int s = n1+n2+remember;
        
        char rs_tmp = s%10 + '0';
        rs = rs_tmp + rs;
        remember = s/10;
    }
    if (remember!=0)
        return char(remember+'0')+rs;
    return rs;
}

string luythua(string x, int n, int d)
{
    if (n==0) return "1";
    else if (n==1) return x;
    string rs = x;
    for (int i=2; i<=n; i++)
    {
        string rs_tmp = rs;
        for (int j=2; j<=d; j++)
        {
            rs = Cong(rs, rs_tmp);  //2^3 = ((2)*2)*2 = ((2)+(2))+((2)+(2))
        }
    }
    return rs;
}

int main()
{
    int n, m;
    cin>>n>>m;
    string lt2 = luythua("2", n, 2);
    string lt3 = luythua("3", m, 3);
    
    string S = Cong(lt2, lt3);
    
    cout<<S[0];
    return 0;
}

JAVA:

...

Python:

...
P163SUMH - ROUND 3H - Xúc xắc

P163SUMH - ROUND 3H - Xúc xắc

Link Sub: https://www.spoj.com/PTIT/problems/P163SUMH/
Người Gửi: Dương Lee

  • Problem:

Tí và Tèo đang chơi xúc xắc, mỗi người chọn ra một con số từ 1 đến 6 và sẽ tung xúc xắc để xem giá trị của con xúc xắc gần với con số của người nào hơn. Giá trị x gọi là gấn số a hơn số b nếu |x – a| < |x – b|  
Giờ đây bạn biết 2 con số mà Tí và Tèo đã chọn, hãy tính xem có bao nhiêu giá trị của xúc xắc mà gần số của Tí hơn, bao nhiêu giá trị mà khoảng cách tới 2 con số đã chọn như nhau và bao nhiêu giá trị mà nó gần với số của Tèo hơn và in ra kết quả lần lượt theo thứ tự như trên.
Input
Một dòng duy nhất gồm 2 số nguyên a, b (1 <= a, b <= 6)
Output
Kết quả bài toán.
Example:
Input
2 5
Output:
3 0 3

  • Solution:

Bài này chỉ việc đếm thôi, chạy hết tất cả các trường hợp có thể có của xúc xắc (1->6) và đếm những trường hợp nào gần a hơn, trường hợp nào gần b hơn và bằng nhau.

  • Code:

C:

https://ideone.com/I2191f
#include <stdio.h>
#include <math.h>

int main()
{
    int a, b;
    scanf("%d%d", &a, &b);
    int ganA=0, ganB=0, bang=0;
    for (int i=1; i<=6; i++)
    {
        if (abs(a-i)<abs(b-i)) ganA++;
        else if (abs(a-i)>abs(b-i)) ganB++;
        else bang++;
    }
    printf("%d %d %d", ganA, bang, ganB);
    return 0;
}

C++:

...

JAVA:

...

Python:

...
P151SUMB - ROUND 1B - Đong gạo

P151SUMB - ROUND 1B - Đong gạo

Link Sub: https://www.spoj.com/PTIT/problems/P151SUMB/
Người Gửi: Dương Lee

  • Problem:

Tuyenlv7 bị mẹ giao cho nhiệm vụ đó là đong gạo để mang lên nhà trọ. Anh được mẹ đưa cho 2 loại bịch, là loại 5 kg và 3 kg. Tuyenlv7 sẽ phải đong đủ số gạo mà mẹ cho vào 2 loại bịch trên.  
Ví dụ mẹ cho 18 kg thì Tuyenlv7 có thể đong bằng 3 bịch 5kg + 1 bịch 3kg hoặc 6 bịch 3 kg.  
Hãy giúp anh ấy đong với số lượng bịch ít nhất có thể, nếu không thể đong được, in ra -1.
Input
Dòng duy nhất chứ số N là số gạo mẹ Tuyenlv7 cho ( 0 < N < 5000).
Output
In ra đáp án của bài toán.
Example:
Input
18
Output:
4

  • Solution:

Vì các bao chứa gạo đều là số nguyên tố, vậy nên với m(kg) gạo nếu chia được ta luôn có:
m = i*3 + j*5
->CT1: j = (m-i*3)/5 (hoặc CT2: i = (m-j*5)/3) (trong đó i là số bao 3kg, j là số bao 5 kg)
Với công thức trên ta chỉ cần for() với từng trường hợp của  i (hoặc j) và xét thêm điều kiện j nguyên (hoặc i nguyên) đối với CT1 (hoặc CT2) là đã xét được đầy đủ các trường hợp có thể chia ra các Bao
Việc còn lại là chỉ cần xác định trường hợp nào là ít bao nhất bằng phép tính: số bao gạo = i+j

  • Code:

C:

https://ideone.com/Cpxb9T
#include <stdio.h>

int main()
{
    int N;
    scanf("%d", &N);
    
    int minB = 5000;
    for (int i=0; i<=(N/3); i++)
    {
        int kg = i*3;
        int kgRe = N - (kg);
        if (kgRe%5==0)
        {
            int B = i+kgRe/5;
            if (B<minB)
            {
                minB = B;
            }
        }
    }
    if (minB==5000)
        printf("-1");
    else
        printf("%d", minB);
    return 0;
}

C++:

...

JAVA:

...

Python:

...
ALGOPRO6 - Giá trị của năm

ALGOPRO6 - Giá trị của năm

Link Sub: https://www.spoj.com/PTIT/problems/ALGOPRO6/
Người Gửi: Dương Lee

  • Problem:

Bạn được yêu cầu viết 1 chương trình tính toán với công việc như sau: Cho một năm thuộc đoạn 1900 – 2100, hãy tính giá trị của năm đó.  
Ta có giá trị của 1 ngày được tính bởi công thức:  
Val = tổng các chữ số của ngày + tổng các chữ số của tháng + tổng các chữ số của năm.  
Giá trị của năm bằng tổng giá trị của tất cả các ngày trong năm đó.  
Ví dụ giá trị của ngày 4/4/2016 là 4 + 4 + 2 + 0 + 1 + 6 =  17.
Input
Dòng duy nhất chứa số năm.
Output
In ra duy nhất 1 số là đáp án của bài toán.
Example:
Input
2016
Output:
6891

  • Solution:

- Bài này yêu cầu tổng tất cả các giá trị các ngày trong vòng một năm. Vậy nên ngoài việc xác định tháng có 30 và 31 ngày thì cũng phải cần xác định tháng 2 trong năm đó là tháng có 28 hay 29 ngày.
- Đối với năm nhuận: là năm chia hết cho 4 và không chia hết cho 100 hoặc là năm chia hết cho 400 thì năm đó sẽ có tháng 2 có 29 ngày.

  • Code:

C++:

https://ideone.com/PKBppU
#include <iostream>
using namespace std;

int main ()
{
    int n;
    cin>>n;
    int ngay;
    int s=0;
    for (int i=1; i<=12; i++)
    {
        if (i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12)
            ngay=31;
        else if (i==2)
        {
            if ((n%4==0 && n%100!=0) || (n%400==0))
                ngay=29;
            else
                ngay=28;
        }
        else
            ngay=30;
            
        for (int j=1; j<=ngay; j++)
        {
            s=s+(j/10)+(j%10)+(i/10)+(i%10)+n/1000+(n/100)%10+(n/10)%10+n%10;
        }
    }
    cout<<s;
}

JAVA:

...

Python:

...
P163PROI - ROUND 3I - Shopping

P163PROI - ROUND 3I - Shopping

Link Sub: https://www.spoj.com/PTIT/problems/P163PROI/
Người Gửi: Dương Lee

  • Problem:

Hôm nay, Gấu đang đợi bạn Chuột tới chơi nhà. Để chuẩn bị cho việc này, Gấu quyết định đi ra 2 cửa hàng gần nhà để mua bánh kẹo tiếp đãi bạn Chuột. Biết khoảng cách từ nhà Gấu tới cửa hàng thứ nhất là d1 và tới cửa hàng thứ 2 là d2. Ngoài ra, còn một con đường nối từ cửa hàng thứ nhất tới cửa hàng thứ hai là d3. Các bạn hãy tính giúp Gấu, quãng đường ngắn nhất mà Gấu phải đi để từ nhà tới được 2 cửa hàng và lại quay về nhà nhé!
Input
Một dòng duy nhất gồm 2 số nguyên d1, d2, d3 (1 <= d1, d2, d3 <= 10^8).
Output
Quãng đường ngắn nhất mà Gấu phải đi qua.
Example:
Input
10 20 30
Output:
60

Input
1 1 5
Output:
4
  • Solution:

Bài này để ngắn gọn thì chỉ ta chỉ xét các trường hợp chính sau:
- Nhà -> CH1 -> CH2 -> Nhà
- Nhà -> CH1 -> Nhà -> CH2 -> Nhà
- Nhà -> CH1 -> CH2 -> CH1 -> Nhà
- Nhà -> CH2 -> CH1 -> CH2 -> Nhà
Lưu ý: Chỉ xét đến quãng đường nên Nhà -> CH1 và CH1 -> Nhà, ... là như nhau.

  • Code:

C++:

https://ideone.com/z25lQC
#include <iostream>
#include <algorithm>
using namespace std;

int main () 
{
    long long a, b, c;
    cin>>a>>b>>c;
    long long d[5];
    d[0]=a+b+c;
    d[1]=2*a+2*b;
    d[2]=2*a+2*c;
    d[3]=2*b+2*c;
    sort (d, d+4);
    cout<<d[0];

    return 0;
} 

JAVA:

...

Python:

...