codeforces B. Omkar and Last Class of Math

codeforces B. Omkar and Last Class of Math_第1张图片

题目

题意:

给你一个数字 n n n,你需要求出两个数 a , b a,b a,b满足 a + b = n a+b=n a+b=n l c m ( a . b ) lcm(a.b) lcm(a.b)最小。

思路:

我们可以发现当 g c d ( a , b ) ≠ 1 gcd(a,b) \not =1 gcd(a,b)=1的时候,那么 n % a = 0 n\%a=0 n%a=0或者 n % b = 0 n\%b=0 n%b=0,我们又可以发现,此时的 g c d ( a , b ) = g c d ( a , n − a ) = g c d ( n i , n − n i ) = g c d ( n i , n ( i − 1 ) i ) = g c d ( a , a ( i − 1 ) ) = a ( i > 1 , a ∗ i = n ) gcd(a,b) = gcd(a,n-a)=gcd(\frac{n}{i},n-\frac{n}{i})=gcd(\frac{n}{i},\frac{n(i-1)}{i})=gcd(a,a(i-1))=a(i>1,a*i=n) gcd(a,b)=gcd(a,na)=gcd(in,nin)=gcd(in,in(i1))=gcd(a,a(i1))=a(i>1,ai=n)然后根据公式遍历就行了,需要注意的是当 i = 1 i=1 i=1的时候需要特判,比如 11 11 11的时候(不存在 n % i = 0 n\%i=0 n%i=0)。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecl;
typedef pair<int, int> pii;
template <class T>
inline void read(T &ret) {
    char c;
    int sgn;
    if (c = getchar(), c == EOF) return ;
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    sgn = (c == '-') ? -1:1;
    ret = (c == '-') ? 0:(c - '0');
    while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
    ret *= sgn;
    return ;
}
int xxxxxxxxx = 1;
inline void outi(int x) {if (x > 9) outi(x / 10);putchar(x % 10 + '0');}
inline void outl(ll x) {if (x > 9) outl(x / 10);putchar(x % 10 + '0');}
inline void debug(ll x) {cout << xxxxxxxxx++ << " " << x << endl;}
inline void debugs(string s) {cout << s << endl;}
int main() {
    int t; read(t); while (t--) {
        int n; read(n);
        bool flag = false;
        for (int i = 2; i <= sqrt(n); i++) {
            if (n % i == 0) {
                int x = n / i;
                printf("%d %d\n", x, n - x);
                flag = true;
                break;
            }
        }
        if (!flag) printf("1 %d\n", n - 1);
    }
    return 0;
}

你可能感兴趣的:(codeforces)