zoukankan      html  css  js  c++  java
  • 曹冲养猪(xjb改题+xjb抄标程)

    啊这题和东方没关系……我是在黑初中时候某个同学(

    p.s.CaO是氧化钙(

     

    题目描述

    自从CaO冲搞定♂了大象以后,CaOCaO就开始捉摸让儿子干些事业,于是派他到中原养zdx场养zdx,

    可是CaO冲满不高兴,于是在工作中马马虎虎,有一次CaOCaO想知道母猪的数量,于是CaO冲想狠

    狠耍CaOCaO一把。举个例子,假如有16头母zdx,如果建了3个zdx圈,剩下1头zdx就没有地方安家

    了。如果建造了5个zdx圈,但是仍然有1头zdx没有地方去,然后如果建造了7个zdx圈,还有2头没有

    地方去。你作为CaO总的私人秘书理所当然要将准确的zdx数报给CaO总,你该怎么办?

    输入

    第一行包含一个整数n (n <= 10) – 建立zdx圈的次数,解下来n行,每行两个整数ai, bi( bi <= ai <= 1000),

     表示建立了ai个zdx圈,有bi头zdx没有去处。你可以假定ai,aj互质.

    输出

    输出包含一个正整数,即为CaO冲至少养母zdx的数目。

    zdx不是猪谁是猪呢(

    这题似乎又和exgcd有关系……

    中国剩余定理:

    当a[i]都为素数
    M=a[1]*a[2]*...*a[n]
    X=k1+k2+...+kn
    ki %a[i]= b[i]
    ki %a[j]=0 i!=j
    inv(x,y) 为x在mod y意义下的逆元
    ki=(M/a[i])*inv((M/a[i]),a[i])*b[i]

    X%3=2
    X%5=3
    X%7=2
    M=3*5*7=105
    X=k1+k2+k3
    k1=35*inv(35,3)*2
    =35*2*2=140 = 35
    k2=21*1*3=63
    k3=15*1*2=30
    X=128%M = 23
    O(nlogn)

    int inv(int a,int b){// 求 mod b意义下 a的逆元
    int x,y;
    exgcd(a,b,x,y);
    return x%b;
    }
    ak % b = 1


    扩展欧几里得 两两合并

    n
    X%a[i] = b[i]

    X % a1 = b1 -> X+ k1*a1 = b1
    X % a2 = b2 -> X+ k2*a2 = b2

    k1*a1 - k2*a2 = b1-b2
    ax+by = c
    exgcd(a1,-a2,k1,k2);

    X % a1a2 = ?

                 ——zrt

    仍然不懂

    zrt大佬写的剩余定理代码:

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 //by zrt
     5 //problem:
     6 using namespace std;
     7 const int inf=(1<<30);
     8 typedef long long LL;
     9 const double eps=1e-8;
    10 int M=21252;
    11 void exgcd(LL a,LL b,LL&d,LL&x,LL&y){
    12     if(!b) d=a,x=1,y=0;
    13     else{
    14         exgcd(b,a%b,d,y,x);y-=(a/b)*x;
    15     } 
    16 }
    17 LL R1,R2,R3;
    18 int p,e,i,D;
    19 int main(){
    20     //-x/2 = -(x/2)
    21     printf("%d %d
    ",(-3)/2,-3>>1);
    22     LL y,d;
    23     exgcd(M/23,23,d,R1,y);
    24     exgcd(M/28,28,d,R2,y);
    25     exgcd(M/33,33,d,R3,y);
    26     R1=(M/23*R1)%M;
    27     R2=(M/28*R2)%M;
    28     R3=(M/33*R3)%M;
    29     int tt=0;
    30     
    31     while(scanf("%d%d%d%d",&p,&e,&i,&D),~p){
    32         printf("Case %d: the next triple peak occurs in ",++tt);
    33         LL ans=(R1*p+R2*e+R3*i-D)%M;
    34         ans=(ans+M)%M;
    35         if(ans==0){
    36             printf("%d days.
    ",M);
    37         }else printf("%lld days.
    ",ans);
    38     }
    39     return 0;
    40 }

    标程题解:

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 #define N 5050
     5 typedef long long LL;
     6 LL m[N];
     7 LL M=1,n,ans;
     8 LL t[N],Mn[N],MM[N];
     9  
    10 LL exgcd(LL a,LL b,LL &x,LL &y)
    11 {
    12     if(b==0)
    13     {
    14         x=1,y=0;return a;
    15     }
    16     else
    17     {
    18         LL t=exgcd(b,a%b,y,x);
    19         y-=x*(a/b);
    20         return t;
    21     }
    22 }
    23  
    24 LL CRT()
    25 {
    26     LL temp;
    27     for(LL i=1;i<=n;i++)
    28     {
    29         MM[i]=M/m[i];
    30         LL k=exgcd(MM[i],m[i],Mn[i],temp);
    31         ans+=(MM[i]*Mn[i]*t[i]);
    32     }
    33     return ((ans%M)+M)%M;
    34 }
    35  
    36 int main()
    37 {
    38     freopen("cao.in","r",stdin);
    39     freopen("cao.out","w",stdout);
    40     cin>>n;
    41     for(LL i=1;i<=n;i++)
    42     {
    43         scanf("%d%d",&m[i],&t[i]);
    44         M*=m[i];
    45     }
    46      
    47     cout<<CRT()<<endl;
    48      
    49     return 0;     
    50 }

    都tm不是我的代码

    没了

  • 相关阅读:
    面向对象 (11)求交并集 判断字符形式
    软件工程 课程总结
    面向对象 (10)正则判邮箱
    面向对象 (9)计算时间差 找随机数范围内规律
    面向对象 (8)字符串出现字符个数统计 字母组成回文串判定
    面向对象 (7)中介买房 平均数异常处理
    面向对象 (6)买房付首款
    第16周作业
    第15周作业
    迟到的第14周作业
  • 原文地址:https://www.cnblogs.com/aristocrat/p/8496163.html
Copyright © 2011-2022 走看看