2018年全国多校算法寒假训练营练习比赛(第三场)

A——链接:https://www.nowcoder.net/acm/contest/75/A
来源:牛客网

夫夫有一天对一个数有多少位数感兴趣,但是他又不想跟凡夫俗子一样,
所以他想知道给一个整数n,求n!的在8进制下的位数是多少位。

输入描述:

第一行是一个整数t(0<t<=1000000)(表示t组数据)
接下来t行,每一行有一个整数n(0<=n<=10000000)

输出描述:

输出n!在8进制下的位数。

示例1

输入

3
4
2
5

输出

2
1
3
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const double Pi = asin(1.0)*2;
typedef long long  ll;
const double e = 2.718281828459;
const int inf = 0x3f3f3f3f;
const int moder = 1e9 + 7;
const int MAXN=1000000;

int main()
{
    int t;
    scanf("%d", &t);
    double temp = log(8);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        if(n == 0 || n == 1)
            cout << 1 << endl;
        else
        {
            double ans = ((log(2*n*Pi)/2)+n*(log(n/e)))/temp + 1;
            printf("%d
", (int)ans);
        }
    }
    return 0;
}

妈的,用cin超时了,花了我一个小时。

B——链接:https://www.nowcoder.net/acm/contest/75/B
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

uu遇到了一个小问题,可是他不想答。你能替他解决这个问题吗?
问题:给你k对a和r是否存在一个正整数x使每队a和r都满足:x mod a=r,求最小正解x或无解。

输入描述:

第一行是正整数k(k<=100000)
接下来k行,每行有俩个正整数a,r(100000>a>r>=0)

输出描述:

在每个测试用例输出非负整数m,占一行。
如果有多个可能的值,输出最小的值。
如果没有可能的值,则输出-1。
示例1

输入

2
8 7
11 9

输出

31
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
typedef long long  ll;

const int inf = 0x3f3f3f3f;
const int moder = 1e9 + 7;
const int MAXN=100005;

ll extgcd(ll a,ll b,ll &x,ll &y)
{
    ll d = a;
    if(b == 0)
    {
        x = 1;
        y = 0;
    }
    else
    {
        d = extgcd(b,a%b,y,x);
        y -= (a/b)*x;
    }
    return d;
}

ll solve(ll a[],ll r[],ll n)
{
    ll d,c,i,x,y,t;
    for(i=1;i<n;i++)
    {
        c=r[i]-r[i-1];
        d=extgcd(a[i-1],a[i],x,y);
        if(c%d!=0) return -1;
        t=a[i]/d;
        x=(x*(c/d)%t+t)%t;
        r[i]=a[i-1]*x+r[i-1];
        a[i]=a[i-1]*(a[i]/d);
    }
    return r[n-1];
}
int main()
{
    ll n;
    ll a[MAXN];
    ll r[MAXN];
    cin >> n;
    for(int i=0;i < n;i++)
    {
        cin >> a[i] >> r[i];
    }
    ll ans = solve(a,r,n);
    cout << ans << endl;

    return 0;
}

线性同余方程组裸题

D——链接:https://www.nowcoder.net/acm/contest/75/D
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

小牛和小客玩石子游戏,他们用n个石子围成一圈,小牛和小客分别从其中取石子,谁先取完谁胜,每次可以从一圈中取一个或者相邻两个,每次都是小牛先取,请输出胜利者的名字(小牛获胜输出XiaoNiu,小客获胜输出XiaoKe)(1 2 3 4 取走 2 13 不算相邻)


输入描述:

输入包括多组测试数据
每组测试数据一个n(1≤n≤1e9)

输出描述:

每组用一行输出胜利者的名字(小牛获胜输出XiaoNiu,小客获胜输出XiaoKe)
示例1

输入

2
3

输出

XiaoNiu
XiaoKe
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
typedef long long  ll;

const int inf = 0x3f3f3f3f;
const int moder = 1e9 + 7;
const int MAXN=1000010;

int main()
{
    ll n;
    while(cin >> n)
    {
        if(n > 2)
            cout << "XiaoKe" << endl;
        else
        {
            cout << "XiaoNiu" << endl;
        }
           
    }
    return 0;
}

博弈

原文地址:https://www.cnblogs.com/cunyusup/p/8413695.html