Gym - 100199C

Gym - 100199C

题意:

其实这么长的英文题面就是想告诉我们这个题是丢手绢。

解法:

找到与 $ N $ 互质的最大整数 $ K $ 即可。当 $ N $ 为奇数时, $ \frac{N-1}{2} $ 即为所求数;当N为偶数时,如果 $ \frac{N}{2} - 1 $ 是奇数,则为所求结果,如果为偶数,$ \frac{N}{2} - 2 $ 为所求结果
不过要注意数据范围很大,需要写高精度。

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

#define LL long long
#define N 2010

using namespace std; 

const int INF = 1e9; 
char s[N]; 
int a[N],T; 

int main() {
    scanf("%s", s); 
    int len = strlen(s); 
    int p = 0; 
    for (int i = 0; i < len; i++) {
        a[i] = (p % 2) * 5 + (s[i] - '0')/2; 
        p = s[i] - '0'; 
    }
    if ((s[len-1] - '0') & 1) {
        if (a[0]) printf("%d", a[0]); 
        for (int i = 1; i < len; i++)
            printf("%d", a[i]); 
        puts(""); 
    } else {
        if (a[len-1] & 1) {
            if (a[len-1] >= 2) a[len-1] -= 2; 
            else {
                int i;
                a[len - 1] += 8; 
                for (int i = len-2; i >= 0; i--) {
                    if (a[i] != 0) {
                        a[i] -= 1; 
                        break; 
                    }
                }
                for(int i = i + 1; i < len; i++)
                    a[i] = 9; 
            }
        }
        else {
            if (a[len-1] >= 1) a[len-1] -= 1; 
            else {
                int i; 
                a[len-1] += 9; 
                    for (i = len-2; i >= 0; i--) {
                    if (a[i] != 0) {
                        a[i] -= 1; 
                        break; 
                    }
                }
                for (i = i + 1; i < len; i++)
                   a[i] = 9; 
            }
        }
        int i; 
        for(i = 0 ; i < len && a[i] == 0 ; i++); 
        for(int j = i; j < len; j++) 
            printf("%d", a[j]); 
        puts(""); 
    }
    //system("pause");
    return 0;
}
posted @ 2019-08-24 22:07  西窗夜雨  阅读(111)  评论(0编辑  收藏  举报