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行,每行两个整数, 表示建立了个牛棚,有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)