列表

详情


NC51077. Xiao 9*大战朱最学

描述

背景

Xiao 9*、朱最学、小全同属LOI,朱某某同学由于学习认真得到了小全的仰慕~~送其外号---朱最学。最学想:神牛我当不成难道还养不成?随后便出现了到Xiao 9*农场放牛的情况- -(灰常无语)。于是Xiao 9*与朱最学间的一场战争便开始了。。。

描述

自从朱最学~搞定了QQ农场以后,就开始捉摸去QQ牧场干些事业,不仅自己牧场养牛,还到Xiao 9*农场放牛- -!Xiao 9*很生气,有一次朱最学想知道Xiao 9*牧场奶牛的数量,于是Xiao 9*想狠狠耍朱最学一把。举个例子,假如有16头奶牛,如果建了3个牛棚,剩下1头牛就没有地方安家了。如果建造了5个牛棚,但是仍然有1头牛没有地方去,然后如果建造了7个牛棚,还有2头没有地方去。你作为Xiao 9*的私人秘书理所当然要将准确的奶牛数报给Xiao 9*,你该怎么办?

输入描述

第一行包含一个整数n  – 建立牛棚的次数,解下来n行,每行两个整数, 表示建立了a_i个牛棚,有bi头牛没有去处。你可以假定ai,aj互质.

输出描述

输出包含一个正整数,即为Xiao 9*至少养奶牛的数目。

示例1

输入:

3
3 1
5 1
7 2

输出:

16

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 484K, 提交时间: 2022-08-05 19:27:08

#include<bits/stdc++.h>
using namespace std;
#define N 20
#define ll long long
ll n,x,y,ans;
ll a[N],m[N];
inline ll exgcd(ll a,ll b,ll &x,ll &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    ll ret=exgcd(b,a%b,x,y);
    ll t=x;x=y,y=t-(a/b)*y;
    return ret;
}
inline ll China(ll n)
{
    ll ans=0,M=1;
    for(ll i=1;i<=n;i++)M*=m[i];
    for(ll i=1;i<=n;i++)
    {
        ll Mi=M/m[i];
        exgcd(Mi,m[i],x,y);
        ans=(ans+x*a[i]*Mi)%M;
    }
    if(ans<0)ans+=M;
    return ans;
} 
int main()
{
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++)
        scanf("%lld%lld",&m[i],&a[i]);
    ans=China(n);
    printf("%lld\n",ans);
    return 0;
}

C++(clang++11) 解法, 执行用时: 3ms, 内存消耗: 376K, 提交时间: 2020-11-09 07:57:24

#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
int a[12],b[12];
int n,Ans = 0;
int sum = 1;
int Mod ;
signed main()
{
    cin >> n;
    for(int i = 1 ; i <= n ; i ++)cin >> a[i] >> b[i];
    for(int i = 1 ; i <= n ; i ++)sum *= a[i],Mod = sum;
    for(int i = 1 ; i <= n ; i ++)
    {
        if(a[i] == 1)continue;
        int t = sum / a[i],A=t;
        while(A % a[i] != 1)A += t;
        Ans = Ans + (A * b[i]) % Mod;
        Ans %= Mod;
    }
    cout << Ans % Mod;
    return 0;
}

Python3 解法, 执行用时: 49ms, 内存消耗: 4608K, 提交时间: 2023-05-27 10:30:27

def Exgcd(a,b):
    if b==0:
        return 1,0,a
    else:
        x,y,d=Exgcd(b,a%b)
        x,y=y,(x-(a//b)*y)
        return x,y,d
    
a=[]
b=[]
n=int(input())
M=1
ans=0
for i in range(n):
    x,y=map(int,input().split())
    M*=x
    a.append(x)
    b.append(y)
for i in range(n):
    mi=M//a[i]
    x,y,d=Exgcd(mi,a[i])
    ans+=mi*b[i]*x%M
    ans%=M
print(ans%M)

上一题