用户工具

站点工具


2020-2021:teams:namespace:牛客多校第三场

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
2020-2021:teams:namespace:牛客多校第三场 [2020/07/20 09:44]
great_designer [A]
2020-2021:teams:namespace:牛客多校第三场 [2020/07/23 21:28] (当前版本)
great_designer [A]
行 278: 行 278:
 </​hidden>​ </​hidden>​
  
-=====A=====+=====F===== 
 + 
 +解一次不定方程题目。注意后面情况讨论以及调整为正数的操作。
  
 <​hidden>​ <​hidden>​
 <code C> <code C>
  
-</code> +#include<stdio.h>
-</hidden>+
  
-=====A=====+char isprime[2000010];​ 
 +int sq[2000010];​ 
 +  
 +long long exgcd(long long a,long long b,long long *x,long long *y) 
 +
 +    if(!b) 
 +
 + (*x)=1; 
 + (*y)=0; 
 + return a; 
 +
 +    long long r=exgcd(b,​a%b,&​(*x),&​(*y)),​t=(*x); 
 +    (*x)=(*y); 
 + (*y)=t-a/​b*(*y);​ 
 +    return r; 
 +}
  
-<hidden+long long gcd(long long a,long long b) 
-<code C>+
 +    return (b==0)?​a:​gcd(b,​a%b);​ 
 +
 +  
 +char cal(long long a,long long b,long long c,long long *x,long long *y) 
 +
 +    if(c%gcd(a,​b)!=0) 
 +
 + return 0; 
 +
 +    long long q=exgcd(a,​b,&​(*x),&​(*y));​ 
 +    long long v=c/q; 
 +    (*x)*=v; 
 + (*y)*=v; 
 + (*y)*=-1;​ 
 +    return 1; 
 +
 +  
 +int main() 
 +
 + isprime[0]=isprime[1]=1;​ 
 + int i; 
 + sq[1]=1; 
 + for(i=2;i<=20000;​i++) 
 +
 + if(!isprime[i]) 
 +
 + int j; 
 + for(j=i*i;​j<​=2000000;​j+=i) 
 +
 + isprime[j]=1;​ 
 +
 +
 + if(i*i<​=2000005) 
 +
 + sq[i*i]=i;​ 
 +
 +
 +    for(i=1;​i<​2000005;​i++) 
 +
 + if(!sq[i]) 
 +
 + sq[i]=sq[i-1];​ 
 +
 +
 +    int T; 
 +    scanf("​%d",&​T);​ 
 +    while(T--) 
 +    { 
 +    long long a,b; 
 +        scanf("​%lld%lld",&​a,&​b);​ 
 +        if(b==1) 
 +
 + printf("​-1 -1 -1 -1\n"​);​ 
 +
 +        else if(a%b==0) 
 +        { 
 +            int x=a/b; 
 +            printf("​%d 1 %d 1\n",​x+1,​1);​ 
 +        } 
 +        else if(!isprime[b]) 
 +        { 
 +            printf("​-1 -1 -1 -1\n"​);​ 
 +        } 
 +        else 
 +        { 
 +            int flag=1; 
 +            long long l,r; 
 +            for(l=2,​r=sq[b]+2;​l<​=r+1;​l++,​r--) 
 +            { 
 +                if(l>=2&&​l<​b&&​b%l==0) 
 +                { 
 +                    long long x=l,​y=b/​x,​c,​e;​ 
 +                    if(cal(y,​x,​a,&​c,&​e)) 
 +                    { 
 +                        if(c<=0||e<​=0) 
 +                        { 
 +                            if(c<​=0&&​e<​=0) 
 +
 + printf("​%lld %lld %lld %lld\n",​-e+y,​y,​-c+x,​x);​ 
 +
 +                            else if(e<​=0) 
 +                            { 
 +                                long long q=(-e)/​y+2;​ 
 +                                printf("​%lld %lld %lld %lld\n",​c+x*q,​x,​e+y*q,​y);​ 
 +                            } 
 +                        } 
 +                        else 
 +
 + printf("​%lld %lld %lld %lld\n",​c,​x,​e,​y);​ 
 +
 +                        flag=0; 
 +                        break; 
 +                    } 
 +                } 
 +                if(r>=2&&​r<​b&&​b%r==0) 
 +                { 
 +                    long long x=r,​y=b/​x,​c,​e;​ 
 +                    if(cal(y,​x,​a,&​c,&​e)) 
 +                    { 
 +                        if(c<​=0||e<​=0) 
 +                        { 
 +                            if(c<​=0&&​e<​=0) 
 +
 + printf("​%lld %lld %lld %lld\n",​-e+y,​y,​-c+x,​x);​ 
 +
 +                            else if(e<​=0) 
 +                            { 
 +                                long long q=(-e)/​y+2;​ 
 +                                printf("​%lld %lld %lld %lld\n",​c+x*q,​x,​e+y*q,​y);​ 
 +                            } 
 +                        } 
 +                        else 
 +
 + printf("​%lld %lld %lld %lld\n",​c,​x,​e,​y);​ 
 +
 +                        flag=0; 
 +                        break; 
 +                    } 
 +                } 
 +            } 
 +            if(flag) 
 +
 + printf("​-1 -1 -1 -1\n"​);​ 
 + }  
 +        } 
 +    } 
 +    return 0; 
 +}
  
 </​code>​ </​code>​
 </​hidden>​ </​hidden>​
  
-=====A=====+=====L===== 
 + 
 +C语言优秀练习题。
  
 <​hidden>​ <​hidden>​
 <code C> <code C>
 +
 +#​include<​stdio.h>​
 +
 +char a[105];
 +
 +int main()
 +{
 +    scanf("​%s",​a);​
 +    if((a[0]=='​l'​||a[0]=='​L'​)&&​(a[1]=='​o'​||a[1]=='​O'​)&&​(a[2]=='​v'​||a[2]=='​V'​)&&​(a[3]=='​e'​||a[3]=='​E'​)&&​(a[4]=='​l'​||a[4]=='​L'​)&&​(a[5]=='​y'​||a[5]=='​Y'​))
 + {
 +        printf("​lovely\n"​);​
 +    }
 +    else
 +    {
 +        printf("​ugly\n"​);​
 +    }
 +    return 0;
 +}
  
 </​code>​ </​code>​
 </​hidden>​ </​hidden>​
  
-=====A=====+=====G===== 
 + 
 +以下是补题。
  
 <​hidden>​ <​hidden>​
-<code C>+<code C++> 
 + 
 +#​include<​stdio.h>​ 
 +#​include<​stdlib.h>​ 
 +#​include<​vector>​ 
 + 
 +using namespace std;  
 + 
 +struct head 
 +
 + struct head *r; 
 + int val; 
 +}; 
 + 
 +int dsu[1000000];​ 
 + 
 +int get(int v) 
 +
 + if (v == dsu[v]) return v; 
 + else return dsu[v] = get(dsu[v]);​ 
 +
 + 
 +pair<​struct head*, struct head*> g[1000000];​ 
 + 
 +pair<​struct head *, struct head *> merge(pair <struct head *, struct head *> a, pair <struct head *, struct head *> b) 
 +
 + if (!a.second) return b; 
 + else 
 +
 + a.second->​r = b.first; 
 + return make_pair(a.first,​ b.second);​ 
 +
 +
 + 
 +pair <struct head*, struct head*> lst(int x) 
 +
 + struct head *t =(struct head*)malloc(sizeof(struct head)); 
 + t->​r=0;​ 
 + t->​val=x;​ 
 + return make_pair(t,​t);​ 
 +
 + 
 +int main() 
 +
 + int t; 
 + scanf("​%d",&​t);​ 
 + while(t--) 
 +
 + int n,m; 
 + scanf("​%d%d",&​n,&​m);​ 
 + int i; 
 + for(i = 0; i < n; i++) 
 +
 + dsu[i] = i; 
 + g[i] =make_pair((struct head*)0,​(struct head*)0); 
 +
 + for(i = 0; i < m; i++) 
 +
 + int x, y; 
 + scanf("​%d%d",&​x,&​y);​ 
 + g[x] = merge(g[x], lst(y)); 
 + g[y] = merge(g[y], lst(x)); 
 +
 + int q; 
 + scanf("​%d",&​q);​ 
 + for(i = 0; i < q; i++) 
 +
 + int c; 
 + scanf("​%d",&​c);​  
 + if (get(c) != c) 
 +
 + continue;​ 
 +
 + else 
 +
 + vector<​int>​ ord; 
 + struct head *s; 
 + for(s = g[c].first; s != 0; s = s->r) 
 +
 + int z = s->​val;​ 
 + if (get(z) != c) 
 +
 + int who = get(z); 
 + dsu[who] = c; 
 + ord.push_back(who);​ 
 +
 +
 + g[c] =make_pair((struct head*)0,​(struct head*)0); 
 + vector<​int>::​iterator p; 
 + for(p=ord.begin();​p!=ord.end();​p++) 
 +
 + g[c] = merge(g[c],​g[(*p)]);​ 
 +
 +
 +
 + for(i = 0; i < n; i++) 
 +
 + printf("​%d ",​get(i));​ 
 +
 + printf("​\n"​);​ 
 +
 +}
  
 </​code>​ </​code>​
 </​hidden>​ </​hidden>​
 +
 +
  
  
2020-2021/teams/namespace/牛客多校第三场.1595209495.txt.gz · 最后更改: 2020/07/20 09:44 由 great_designer