• XVI Open Cup named after E.V. Pankratiev. GP of Peterhof


    A. (a, b)-Tower

    当指数大于模数的时候用欧拉定理递归计算,否则直接暴力计算。

    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<string>
    #include<iostream>
    using namespace std;
    typedef long long LL;
    int pw(int x,int y,int mod){
    	int ret=1;
    	for(int i=0;i<y;i++){
    		ret=1LL*ret*x%mod;
    	}
    	return ret;
    }
    int solve(int l,int r,int p){
    	if(l==1)return 1;
    	if(l==r){
    		return l%p;
    	}
    	int phi=0;
    	for(int i=1;i<=p;i++)if(__gcd(p,i)==1)phi++;
    	return pw(l,solve(l+1,r,phi)+phi,p);
    }
    int main(){
    	freopen("abtower.in","r",stdin);
    	freopen("abtower.out","w",stdout);
    	int a,b;
    	while(scanf("%d%d",&a,&b)!=EOF){
    		printf("%d
    ",solve(a,b,10));
    	}
    }
    

      

    B. Bridges Construction

    留坑。

    C. Equivalence Relation

    留坑。

    D. Formula-1

    留坑。

    E. Ideal Photo

    三分第一个人的位置即可。

    #include <bits/stdc++.h>
    using namespace std ;
    
    const int MAXN = 205 ;
    int n;
    vector<int>V;
    double check(double x){
    	double ret=0;
    	for(int i=0;i<V.size();i++){
    		ret+=sqrt(1.0+1.0*(V[i]-x-i)*(V[i]-x-i));
    	}
    	return ret;
    }
    void solve () {
    	V.clear();
    	for(int i=1;i<=n;i++){
    		int x;scanf("%d",&x);
    		V.push_back(x);
    	}
    	for(int i=1;i<=n;i++){
    		int x;scanf("%d",&x);
    		V.push_back(x);
    	}
    	sort(V.begin(),V.end());
    	double l=-3e6;
    	double r=3e6;
    	for(int i=0;i<300;i++){
    		double l1=l+(r-l)/3,l2=l+(r-l)/3*2;
    		double t1=check(l1),t2=check(l2);
    		if(t1>t2)l=l1;else r=l2;
    	}
    	double ans=check(l);
    	//printf("%.12f %.12f
    ",l,r);
    	printf("%.12f
    ",ans);
    	//for(double l=-5;l<=5;l+=0.1)printf("%.12f
    ",check(l));
    }
    
    int main () {
    	freopen ( "make-a-row.in" , "r" , stdin ) ;
    	freopen ( "make-a-row.out" , "w" , stdout ) ;
    	while ( ~scanf ( "%d" , &n ) ) solve () ;
    	return 0 ;
    }
    

      

    F. (p, q)-Knight

    首先通过exgcd求出一组可行解,然后暴力调整若干项即可。

    #include<stdio.h>
    #include<algorithm>
    #include<math.h>
    #include<string.h>
    #include<string>
    #include<vector>
    #include<set>
    #include<map>
    #include<queue>
    #include<time.h>
    #include<assert.h>
    #include<iostream>
    using namespace std;
    typedef long long LL;
    typedef pair<int,int>pi;
    const LL Inf=1LL<<60;
    LL exgcd(LL a,LL b,LL &x,LL &y){
    	if(!b)return x=1,y=0,a;
    	LL d=exgcd(b,a%b,y,x);
    	y-=a/b*x;return d;
    }
    LL ans;
    void up(LL &x,LL y){if(x>y)x=y;}
    void check(LL t1,LL t2,LL x,LL y){
    	if(abs(t1%2)!=abs(x%2))return;
    	if(abs(t2%2)!=abs(y%2))return;
    	up(ans,max(abs(t1),abs(x))+max(abs(t2),abs(y)));
    	//if(x==10&&y==-3)printf("val=%lld
    ",max(abs(t1),abs(x))+max(abs(t2),abs(y)));
    	//if(x==10&&y==-3)printf("t1=%lld t2=%lld ans=%lld
    ",t1,t2,ans);
    }
    int main(){
    	freopen("pqknight.in","r",stdin);
    	freopen("pqknight.out","w",stdout);
    	LL p,q;
    	while(scanf("%lld%lld",&p,&q)!=EOF){
    		if(p>q)swap(p,q);
    		if(p==0){
    			puts(q==1?"1":"-1");
    			continue;
    		}		
    		if(p==1){
    			if(q%2==1)puts("-1");
    			else printf("%lld
    ",q+1);
    			continue;
    		}
    		if(__gcd(p,q)!=1){
    			puts("-1");
    			continue;
    		}
    		LL x,y;
    		LL t1=p,t2=q;
    		exgcd(p,q,x,y);
    		//printf("x=%lld y=%lld
    ",t1,t2);
    		ans=Inf;
    		for(int i=-2;i<=2;i++){
    			check(t1,t2,x+i*q,y-i*p);
    		}
    		x=-x,y=-y;
    		for(int i=-2;i<=2;i++){
    			check(t1,t2,x+i*q,y-i*p);
    		}
    		if(ans==Inf){
    			puts("-1");
    		}
    		else printf("%lld
    ",ans);
    	}	
    	return 0;
    }
    

      

    G. Random Wormholes

    如果能到1,那么直接走过去,否则随机走向下一个点。

    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<string>
    #include<iostream>
    using namespace std;
    typedef long long LL;
    
    int main(){
    	//freopen("abtower.in","r",stdin);
    	//freopen("abtower.out","w",stdout);
    	while(1){
    		LL RAND=(1LL<<32)-1;
    		printf("1
    ");
    		fflush(stdout);
    		string s;
    		cin>>s;
    		if(s=="yes"){break;}
    		while(1){
    			LL x=(rand()%65536)*65536LL+rand()%65536;
    			printf("%lld
    ",x);
    			fflush(stdout);
    			cin>>s;
    			if(s=="yes")break;
    		}
    	}
    }
    

      

    H. Second Maximum

    分段积分。

    #include <bits/stdc++.h>
    using namespace std ;
    
    const int MAXN = 205 ;
    int n;
    vector<int>V;
    int l[55],r[55];
    double a[55];
    double b[55];
    void mul(double t0,double t1){
    	memset(b,0,sizeof b);
    	for(int i=0;i<=n+1;i++){
    		if(i)b[i]+=a[i-1]*t1;
    		b[i]+=a[i]*t0;
    	}
    	for(int i=0;i<=n+1;i++)a[i]=b[i];
    }
    void solve () {
    	double ans=0;
    	V.clear();
    	for(int i=0;i<n;i++){
    		scanf("%d%d",l+i,r+i);
    		V.push_back(l[i]);
    		V.push_back(r[i]);
    	}
    	sort(V.begin(),V.end());
    	V.erase(unique(V.begin(),V.end()),V.end());
    	for(int it=0;it<V.size()-1;it++){
    		int curl=V[it],curr=V[it+1];
    		for(int i=0;i<n;i++){
    			if(r[i]<=curl)continue;
    			memset(a,0,sizeof a);
    			a[0]=1;
    			//if(curr>l[i])mul((curr+0.0)/(r[i]-l[i]),1.0/(l[i]-r[i]));
    			bool flag=1;
    			for(int j=0;j<n;j++){
    				if(i==j)continue;
    				if(curr<=l[j]){flag=0;break;}
    				if(curl<r[j]){
    					mul((l[j]+0.0)/(l[j]-r[j]),1.0/(r[j]-l[j]));
    				}
    			}
    			if(!flag)continue;
    			/*
    			if(it==1&&i==0){
    				puts("wa");
    				for(int j=0;j<=n;j++)printf("%.2f ",a[j]);puts("");
    			}
    			*/
    			a[0]=0;
    			for(int j=1;j<=n;j++)a[j]*=j;
    			if(curr>l[i])mul((r[i]+0.0)/(r[i]-l[i]),1.0/(l[i]-r[i]));
    			for(int j=1;j<=n+1;j++)a[j]/=j+1;
    			double rr=curr*curr,ll=curl*curl;
    			for(int j=1;j<=n+1;j++){
    				ans+=a[j]*(rr-ll);
    				rr=rr*curr;
    				ll=ll*curl;
    			}
    			//printf("it=%d i=%d ans=%.2f
    ",it,i,ans);
    		}
    	}
    	printf("%.12f
    ",ans);
    }
    int main(){
    	freopen("secondmax.in","r",stdin);
    	freopen("secondmax.out","w",stdout);
    	while(~scanf("%d",&n))solve();
    }
    

      

    I. Ticket To Ride

    留坑。


    总结:

    • 尽快适应数学场。
  • 相关阅读:
    java表达式, 语句, 块(翻译自Java Tutorials)
    java控制流语句(翻译自Java Tutorials)
    你可以将使用搬到ubuntu上
    python进阶学习笔记(三)
    译:selenium webdriver (python)
    异步调用轻量级封装AsynCaller
    企业开发基础设施--事件通知服务(Remoting双向通信)
    企业开发基础设施--序
    关于跨程序集的反射
    异常处理经验谈
  • 原文地址:https://www.cnblogs.com/clrs97/p/6071361.html
Copyright © 2020-2023  润新知