精华内容
下载资源
问答
  • 程序设计-google2012校招笔试

    千次阅读 2013-08-24 01:02:22
    某环形公路有N个站点,分别记为A1,...,An,Ai到A(i+1)距离为Di,An到A1距离为D0。假设D0~D(n-1)保存在数组D[N]。现在要求你写一个函数,能够高效计算出公路任意两点最近距离,要求空间复杂度不能超过...

    第一道程序设计题

    2.1 一个环,N个点,任意相邻两点有一个距离。要求写一个算法,输入为点i和点j,输出是他们之间的最短路径。
    某环形公路上有N个站点,分别记为A1,...,An,从Ai到A(i+1)的距离为Di,An到A1的距离为D0。假设D0~D(n-1)保存在数组D[N]中。现在要求你写一个函数,能够高效的计算出公路上任意两点的最近距离,要求空间复杂度不能超过O(N)。

    【思考】
    1、问题抽象
    1)环形公路可以表示为一个环,站点即为环上的点,环可以用哪种数据结构表示呢?当然是双端链表了。
    2)站点如何表示呢?站点可以视为一个点对象,画出双端链表上的点,我们发现该点对象应该有3个属性:第一属性是站点名Ai,第二个属性时其到前一个站点A(i-1)的距离D(i-1),第三个属性时其到下一个站点A(i+1)的距离D(i+1)。

    3)现在我们有了对题目中研究对象的抽象(环形公路抽象为双端链表,站点抽象为点对象),现在可以把原问题转变为我们程序员熟悉的问题了:
    给定双端链表中的2个点对象,求该2点间的最大距离为多少?

    2、解决问题
    问题抽象后,解决该问题变的简单了很多,点Ai到点Aj无非就有2条路径,一条路径是按图中顺时针方向(经由下一个站点)到达点Aj,另一条路径是按图中逆时针方向(经由前一个站点)到达点Aj。我们只要比较这俩条路径得到较小的那个值即可。
    3、时间复杂度分析
    顺时针方向和逆时针方向遍历链表的和正好是链表的长度n,故该算法时间复杂度为O(n)。
    4、JAVA语言实现

    在JAVA中双端链表可以用LinkedList表示。具体代码如下

    //站点对象类

    public class Point{
       private String name; //站点名称,如Ai
       private double nextPointDistance; //到下一个站点的距离,D(i+1)
       private double previousPointDistance; //到前一个站点的距离,D(i-1)
       
       //constructor
       public Point(){}
       
       //get and set method
       public String getName(){
        return name;
       }//end getName()
       
       public void setName(String name){
        this.name=name;
       }//end setName()
       
       public double getnextPointDistance(){
        return nextPointDistance;
       }//end getnextPointDistance()
       
       public void setnextPointDistance(double nextPointDistance){
        this.nextPointDistance=nextPointDistance;
       }//end setnextPointDistance()
       
       public double getpreviousPointDistance(){
        return previousPointDistance;
       }//end getpreviousPointDistance()
       
       public void setpreviousPointDistance(double previousPointDistance){
        this.previousPointDistance=previousPointDistance;
       }//end setpreviousPointDistance()
       }//end setName()   
    }//end class Point
    主函数shortestPath

    public class HighRoad{
      private LinkedList ll; //双端链表
      
      //------------------------------------------------------
      //constructor
      //------------------------------------------------------
      public HighRoad(String[] pointName,double[] distance){
          initial(pointName,distance)
      }
      
      //------------------------------------------------------
      // API
      //------------------------------------------------------
      /**
      * 求2站点间最大距离
      * @parm name1 站点i
      * @parm name2 站点j
      * @return 返回最大路径,-1代表错误
      */
      public double shortestPath(String name1,String name2){
        //输入控制
    	if(ll==null)
    	  return -1;
    	
    	int llSize=ll.size();
    	if(llSize<1)  //站点数小于2
          return -1;
    	  
    	if(name1==null || name1=="" || name2==null || name2=""){
    	    System.out.println("请输入站点名称");
    	}//end if
    	
    	//在双端链表中获取这2个站点的位置
    	Point point1=findPoint(name1,ll);
    	Point point2=findPoint(name2,ll);	
    	
    	//顺时针方向路径
    	double rightPath=rightPath(point1,point2);
        //逆时针方向路径
    	double leftPath=leftPath(point1,point2);
    	
    	return min(rightPath,leftPath);
      }//end shortestPath()
    主函数中调用的函数

      //------------------------------------------------------
      // private method
      //------------------------------------------------------
      
      //初始化双端链表,将距离和站点名称列入双端链表
      private void initial(String[] pointName,double[] distance) throws Exception{
        if(pointName==null || distance==null){
    		 throw new Exception("请输入站点名称 或 站点距离");
    	
    	int pointNumber=pointName.length();
    	if(pointNumber!=distance.length())
    	    throw new Exception("站点数目要和距离数目一致");
    		
        //至少要有2个站点
    	if(pointNumber< 2)
    	    throw new Exception("至少要有2个站点");
    	
    	//第一个站点和最后一个站点要特殊处理下(数组下标对应关系可以从图中看出来)
    	Point firstPoint=new Point(pointName[0],distance[0+1],distance[0]);
    		ll.addLast(firstPoint);
    	
    	if(pointNumber>=2){ //如果多于2个剩余元素(除了第一个站点和最后一个站点)按以下规则添加
    	    for(int i=1;i<pointNumber-1;i++){
    	        Point point=new Point(pointName[i],distance[i+1],distance[i]);
    			ll.addLast(point);
    	    }//end for
    	}//end if
    
    	 //最后一个元素添加
    	Point lastPoint=new Point(pointName[pointNumber-1],distance[0],distance[pointNumber-1-1]);
    	ll.addLast(lastPoint);
      }//end initial()
    
      //------------------------------------------------------
      private Point findPoint(String name,LinkedList ll){
         Point point=null;
    	 
         Iterator it=ll.iterator();
    	 while(it.hasNext()){
    	    point=(Point)it.next();
    		if(point.getName.equels(name))
    		  return point;
    	 }//end while
      }//end findPoint()
      
      //------------------------------------------------------  
      //顺时针方向路径
      private double rightPath(Point point1,Point point2){
        double result=0; //存储路径值
    	Point current=point1;
    	
    	while(current!=point2){
    	  result+=current.getnextPointDistance();
    	  current=current.next(); //指向下一个站点
    	}//end while
    	
    	return result;
      }//end rightPath()
    
      //------------------------------------------------------   
       //逆时针方向路径
      private double leftPath(Point point1,Point point2){
        double result=0; //存储路径值
    	Point current=point1;
    	
    	while(current!=point2){
    	  result+=current.getpreviousPointDistance();
    	  current=current.previous(); //指向前一个站点
    	}//end while
    	
    	return result;
      }//end leftPath()  
      
      //获取较小值
      private double min(double a,double b){
        if(a<b)
    	  return a;
    	else
    	  return b;
      }//end min()
          
    }//end class HighRoad
    测试用例设计:

    1、只有一个站点
    2、只有2个站点
    3、多于2个站点

    第二道程序设计题


    算法1:利用
    算法2:
    1)翻转:以空格为分界符,用栈翻转每个以分界符的子串,然后将翻转后的子串拼接在一起
    2)删除重复空格,拼接子串的时候
    过程:
    1)入栈:直到遇到第一个空格(空格不入栈)
    2)出栈:将出栈的结果拼接到结果字符串中
    3)并添加一个空格

    //---------------------------------------------------
    public class AlgorithmReverse{
    Stack stack; //栈
    StringBuffer sb; //保存翻转结果
    
    public AlgorithmReverse(){
       stack=new Stack();
       sb=new StringBuffer();
    }
    
    public String reverse(String src){
       //输入控制
        if(src==null || src=="")
          return src;  
        
    	else{
            for(int i=0;i<src.length(); ){
    		   //入栈
    		   char temp=src.getChar(i);
    		   if( temp !=' ')
    		      stack.push(temp);
    		   //出栈
    		   else{
    		      if(!stack.empty()){
    			     for(int j=0;j<stack.size();j++){
    				    sb.append(stack.pop());
    				 }//end for
    			  }//end if
    		   }//end else
    		   //只加入一个空格
    		   sb.append(' ');
    		   //删除重复空格,返回下一个i的值
    		   i=deleteSpace(src,i+1);
    		}//end for
    		
    		return sb.toString();
    	}//end else	
    }//end reverse()
    //---------------------------------------------------
    		//删除重复空格,返回下一个i的值
    		private int deleteSpace(src,int i){
    		 while(src.getChar(i) !=' '){
    		    i++;
    		 }//end while
    		 
    		 return i;
    		}//end delteSpace()
    
    } //end class AlgorithmReverse
    //------------------------------------


    第三道程序设计题

    X<10^6,如何用任意的100、50、20、10、5、2、1来加出X,求所有方法。

    感觉是用因素分解的办法求解,希望会的同仁留言,写出您的算法。



    展开全文
  • 现在需要您写一个数据库连接字符串,用以连接AllWinSQL SERVER中的一个名为PubBase实例的Test库。请问,应该选择下面哪一个字符串?( B )  A. “Server=AllWin;Data Source=PubBase;Initial Catalog=Test;...
  • 某环形公路有N个站点,分别记为A1,...,An,Ai到A(i+1)距离为Di,An到A1距离为D0。假设D0~D(n-1)保存在数组D[N]。现在要求你写一个函数,能够高效计算出公路任意两点最近距离,要求空间复杂度不能超过...

    题目描述:

    2.1 一个环,N个点,任意相邻两点有一个距离。要求写一个算法,输入为点i和点j,输出是他们之间的最短路径。

    某环形公路上有N个站点,分别记为A1,...,An,从Ai到A(i+1)的距离为Di,An到A1的距离为D0。假设D0~D(n-1)保存在数组D[N]中。现在要求你写一个函数,能够高效的计算出公路上任意两点的最近距离,要求空间复杂度不能超过O(N)。


    思路:

    用一个数组A[i],保存D[0]到D[i]的和,然后每次查询的时候只要求min(A[j-1] - A[i-1], A[N-1] - (A[j-1] - A[i - 1])), i, j 属于{1,2,..., N} 并且i<j.

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    const int N = 5;
    double D[N];
    double A[N];
    
    void Preprocess () {
        double sum = 0;
        for (int i = 0; i < N;  ++i ) {
            sum += D[i];
            A[i] = sum;
        }
    }
    
    double Distance (int i, int j ) { // i : 1 ~ N, j : 1 ~ N
        if (i < 1 || j < 1 || i > N || j > N )
            return -1; // illegal input
        if (i == j)
            return 0.0;
        if (i > j)
            std::swap (i, j);
        return min (A[j-1] - A[i-1], A[N-1] - (A[j-1] - A[i-1]));
    }
    
    int main () {
        double t;
        for (int i = 0; i< N; ++i ) {
            cin >> t;
            D[i] = t;
        }
        Preprocess();
        int i, j;
        cout << "input (i, j) >>>";
        while (cin >> i >> j) {
            cout << "distance : " << Distance (i, j) << endl;
            cout << "input (i, j) >>>";
        }
        return 0;
    }


    展开全文
  • 题目链接UVA 1025 A Spy in the Metro题意地铁有n个车站,第一个和最后一个车站会开出地铁,地铁开出时间以及各站之间所需时间已给出,有一名间谍要在时间T内第一站到最后一站,他可以乘坐正向或者反向...

    题目链接

    UVA 1025 A Spy in the Metro

    题意

    地铁中有n个车站,从第一个和最后一个车站会开出地铁,地铁开出时间以及各站之间的所需时间已给出,有一名间谍要在时间T内从第一站到最后一站,他可以乘坐正向或者反向的地铁,但要保证在站点的等待时间最少,求最少的等待时间。(如果a分钟时间谍到达第i站,此时若正好有反向地铁,可以瞬间移动到该车上)

    思路

    简单dp题,用dp[i][j]表示时刻i在车站j至少还要等待多久。边界条件是dp[T][j]=INF(1<=j<n),dp[T][n]=0。
    对于在车站的间谍,有三种选择:

    • 在车站等一分钟。
    • 如果有,搭乘向右开的车。
    • 如果有,搭乘向左开的车。

    复杂度为O(nT)。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int INF=0x3f3f3f3f;
    int dp[200+5][50+5];
    bool train[200+5][50+5][2];
    int durtion[50+5];
    int tim1[50+5];
    int tim2[50+5];
    int m1,m2;
    int kase;
    int n,T;
    int main()
    {
        while(~scanf("%d",&n)&&n)
        {
            memset(dp,0,sizeof dp);
            memset(durtion,0,sizeof durtion);
            memset(train,0,sizeof train);
            memset(tim1,0,sizeof tim1);
            memset(tim2,0,sizeof tim2);
            scanf("%d",&T);
            for(int i=1;i<n;i++)
            {
                scanf("%d",&durtion[i]);
            }
            scanf("%d",&m1);
            for(int i=1;i<=m1;i++)
            {
                scanf("%d",&tim1[i]);
                for(int j=1;j<n;j++)
                {
                    train[tim1[i]][j][0]=1;
                    tim1[i]+=durtion[j];
                }
            }
            scanf("%d",&m2);
            for(int i=1;i<=m2;i++)
            {
                scanf("%d",&tim2[i]);
                for(int j=n-1;j>0;j--)
                {
                    train[tim2[i]][j+1][1]=1;
                    tim2[i]+=durtion[j];
                }
            }
          //  cout<<train[5][2][0]<<endl;
            for(int i=1;i<n;i++)
                dp[T][i]=INF;
            dp[T][n]=0;
            for(int i=T-1;i>=0;i--)
                for(int j=1;j<=n;j++)
                {
                    dp[i][j]=dp[i+1][j]+1;
                   // cout<<dp[i][j]<<endl;
                   // getchar();
                    if(j<n&&train[i][j][0]&&i+durtion[j]<=T)
                        dp[i][j]=min(dp[i][j],dp[i+durtion[j]][j+1]);
                    if(j>1&&train[i][j][1]&&i+durtion[j-1]<=T)
                        dp[i][j]=min(dp[i][j],dp[i+durtion[j-1]][j-1]);
                }
            printf("Case Number %d: ",++kase);
            if(dp[0][1]>=INF)printf("impossible\n");
            else printf("%d\n",dp[0][1]);
        }
        return 0;
    }
    
    展开全文
  • JAVA百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失。使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 ...
  • J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...
  • CCNA中文教材(很全面)

    热门讨论 2011-05-20 10:57:56
    目 录 序言 前言 第1章 网络互连介绍 1 1.1 认证目标1.01:网络互连模型 1 1.1.1 网络发展 2 ...第2章 Cisco IOS软件...附录A 自我测试答案 278 附录B 关于配套光盘 299 附录C 关于Web站点 300 词汇表 301
  • 前言 过年在家颓废很久之后终于开始嫌弃自己,...wls管理的仓库分为ABABAB两个区,这两个区坐落在两条平行的直线,每个区有nnn个站点,标号分别为1...n1...n1...n,agvagvagv站点aaa到同仓库的站点bbb需要花费a...

    前言


    过年在家颓废很久之后终于开始嫌弃自己,开始认真了。
    开始开专题并且补完CAMP的题解。
    这是第一天的camp题解,赛中只做出BCFJ四个题。
    赛后补完:ABCEFIJ


    题解


    A.机器人

    题意

    wls管理的仓库分为ABAB两个区,这两个区坐落在两条平行的直线上,每个区有nn个站点,标号分别为1...n1...nagvagv从站点aa到同仓库的站点bb需要花费abs(ab)abs(a-b)的时间。存在mm个特殊的站点,假如第ii个站点是特殊的,那么agvagv可以花费kk的时间从一个区的ii号站点开到另一个区的ii号站点,agvagv只能通过这些特殊站点实现区与区之间的转换。11号,nn号两个站点都是特殊的站点。
    由于特殊的原因,在同一个区域内,agvagv只能在特殊站点掉头,否则他们只能沿着同一个方向运行。现在agvagv正在AA区的站点ss上,他需要经过rr个给定的站点并回到原处,请问最少需要多少时间?你可以指定agvagv的初始方向。

    做法

    通过分类讨论,我们可以知道最终情况只有以下四种。
    每种情况分别通过二分计算即可。
    ():第一种情况(要经过的点都和起点同侧,而且均在起点的一侧):
    在这里插入图片描述
    这种情况只需要找到最接近最右侧点而且在最右侧点右侧的关键点即可。
    ():第二种情况(要经过的点都和起点同侧,并且遍布起点的两侧):
    在这里插入图片描述
    这种情况只需要找到能让两侧转变方向的最优关键点即可,对于这个的查询可以直接用lower_bound查询。
    (AB):第三种情况(要经过的点在AB两侧都有,并且都在起点的同一侧):
    在这里插入图片描述
    当所有点都在同一侧,而且需要的关键点也在同一侧时,可以直接这样走。
    (AB):第四种情况(要经过的点在AB两侧都有,并且遍布在起点的两侧):
    在这里插入图片描述

    代码

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    #include<queue>
    #include<map>
    #include<bitset>
    #include<stack>
    #include<set>
    #include<vector>
    #include <time.h>
    #include<string.h>
    using namespace std;
    
    typedef long long ll;
    typedef unsigned long long ull;
    typedef double db;
    typedef pair <int, int> pii;
    typedef pair <ll, ll> pll;
    typedef pair <ll, int> pli;
    typedef pair <db, db> pdd;
    
    const int maxn = 1e5+5;
    const int Mod=1000000007;
    const int INF = 0x3f3f3f3f;
    const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
    const double e=exp(1);
    const db PI = acos(-1);
    const db ERR = 1e-10;
    
    #define Se second
    #define Fi first
    #define pb push_back
    #define dbg(x) cout<<#x<<" = "<< (x)<< endl
    #define dbg2(x1,x2) cout<<#x1<<" = "<<x1<<" "<<#x2<<" = "<<x2<<endl
    #define dbg3(x1,x2,x3) cout<<#x1<<" = "<<x1<<" "<<#x2<<" = "<<x2<<" "<<#x3<<" = "<<x3<<endl
    
    vector<int>vec[2];//存放两侧要到达的点
    vector<int>x;//存放关键点
    
    int main()
    {
        int n,r,m,k,s,u,v;
        scanf("%d%d%d%d%d",&n,&r,&m,&k,&s);
        for(int i=1;i<=r;i++)
        {
            scanf("%d%d",&u,&v);
            vec[v].push_back(u);
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&u);
            x.pb(u);
        }
        x.pb(1);
        x.pb(n);
        int flag1=0,flag2=0;
        sort(x.begin(),x.end());
        int minn=n,maxx=1;
        for(int i=0;i<vec[0].size();i++)
        {
            if(vec[0][i]>s) flag1=1;
            if(vec[0][i]<s) flag2=1;
            maxx=max(maxx,*(lower_bound(x.begin(),x.end(),vec[0][i])));//找到第一个在该点右侧的关键点
            minn=min(minn,*(upper_bound(x.begin(),x.end(),vec[0][i])-1));//找到第一个在该点左侧的关键点
        }
        if(vec[1].size()==0)//所有点都在一侧
        {
            if(flag1==0&&flag2==0) printf("0\n");//只有起点一个点
            else if(flag1==0) printf("%d\n",2*(s-minn));//只有起点左侧有点
            else if(flag2==0) printf("%d\n",2*(maxx-s));//只有起点右侧有点
            else printf("%d\n",2*(maxx-minn));//起点两侧都有点
        }
        else
        {
            int minnb=n,maxxb=1;
            for(int i=0;i<vec[1].size();i++)
            {
                maxxb=max(maxxb,*(lower_bound(x.begin(),x.end(),vec[1][i])));//找到第一个在该点右侧的关键点
                minnb=min(minnb,*(upper_bound(x.begin(),x.end(),vec[1][i])-1));//找到第一个在该点左侧的关键点
            }
            maxx=max(maxx,maxxb);
            minn=min(minn,minnb);
            if(flag1==0&&maxxb<=s) printf("%d\n",(s-minn+k)*2);//只有起点左侧有点
            else if(flag2==0&&minnb>=s) printf("%d\n",(maxx-s+k)*2);//只有起点右侧有点
            else printf("%d\n",2*(maxx-minn+k));//起点两侧都有点
        }
        return 0;
    }
    
    

    B.吃豆豆

    题意

    wlswls有一个nnmm列的棋盘,对于第ii行第jj列的格子,每过T[i][j]T[i][j]秒会在上面出现一个糖果,第一次糖果出现在第T[i][j]T[i][j]秒,糖果仅会在出现的那一秒存在,下一秒就会消失。假如wlswlskk秒在第ii行第jj列的格子上,满足T[i][j]kT[i][j] | k,则wlswls会得到一个糖果。
    假如当前wlswls在第ii行第jj列的格子上,那么下一秒他可以选择往上下左右走一格或停在原地。
    现在请问wlswls从指定的SS出发到达指定的TT,并且在路上得到至少CC个糖果最少需要多少时间?
    wlswlsSS的初始时间为第00秒。
    1n,m,T[i][j]101≤n,m,T[i][j]≤10
    1C10181 \leq C \leq 1018
    做法

    可以看到这道题n,m,cn,m,c都很小。
    但是这道题的关键在于换一个方向思考问题,我们直接用dp[i][j][k]dp[i][j][k]表示到达点(i,j)(i,j)得到k个糖果的最短时间的话,是不能dpdp的,因为上一个状态不确定,无法dpdp。但是我们可以发现最后的答案一定不会超过C10C*10,因为我们可以站在一个位置不动,用这些时间就能达到目的,所以我们可用dp[i][j][k]dp[i][j][k]表示到达点(i,j)(i,j)经过时间kk能达到的最大糖果数,这就很容易dpdp了。只要从k1k-1的能到达本点的状态去转移即可。最后找到能到在终点能得到CC个糖果的最短时间即可。

    代码

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    int dp[15][15][12005];
    int T[15][15];
    int dis[5][2]={-1,0,1,0,0,-1,0,1,0,0};
    int main()
    {
        int n,m,c;
        memset(dp,-1,sizeof(dp));
        scanf("%d%d%d",&n,&m,&c);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&T[i][j]);
            }
        }
        int ans;
        int stx,sty,enx,eny;
        scanf("%d%d%d%d",&stx,&sty,&enx,&eny);
        dp[stx][sty][0]=0;
        for(int i=1;i<=10999;i++)
        {
            for(int j=1;j<=n;j++)
            {
                for(int k=1;k<=m;k++)
                {
                    for(int l=0;l<5;l++)
                    {
                        if(i%T[j][k]==0&&dp[j+dis[l][0]][k+dis[l][1]][i-1]!=-1)
                        {
                            dp[j][k][i]=max(dp[j][k][i],dp[j+dis[l][0]][k+dis[l][1]][i-1]+1);
                        }
                        else if(dp[j+dis[l][0]][k+dis[l][1]][i-1]!=-1)
                        {
                             dp[j][k][i]=max(dp[j][k][i],dp[j+dis[l][0]][k+dis[l][1]][i-1]);
                        }
                    }
                }
            }
            if(dp[enx][eny][i]>=c)
            {
                ans=i;
                break;
            }
        }
        printf("%d\n",ans);
        return 0;
    }
    
    

    C.拆拆拆数

    题意

    读入ABA和B,wlswls想请你把A拆成a1,a2,a3...,ana_1,a_2,a_3...,a_n, 把B拆成b1,b2.b3...,bnb_1,b_2.b_3...,b_n, 满足
    1.对于所有的i(1in),ai,bi2gcd(ai,bi)=1i(1 \leq i \leq n),a_i,b_i \ge 2且gcd(a_i,b_i) = 1
    2.Σi=1nai=A,Σi=1nbi=B\varSigma _{i=1}^{n}a_i=A,\varSigma _{i=1}^{n}b_i=B
    如果有多组满足条件的aabb,请输出nn最小的任意一组即可。
    如果无解,请输出1−1
    5A,B10185 \leq A,B \leq 10^{18}
    做法

    首先如果两个数本来就是互质的,只分成一组即可
    其余的情况我们猜测分为两组即可
    首先我们找到第一个不是AA的因子也不是BB的因子的质数PP
    然后这样拆分A,BA,B
    AP    PA-P \ \ \ \ P
    P           BPP \ \ \ \ \ \ \ \ \ \ \ B-P
    因为AA不是PP的倍数,所以APA-P不是PP的倍数,所以gcd(AP,P)=1gcd(A-P,P)=1
    因为BB不是PP的倍数,所以BPB-P不是PP的倍数,所以gcd(P,BP)=1gcd(P,B-P)=1
    因为前15个质数相乘就已经大于101810^{18} ,所以枚举到第15个质数即可。
    代码

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    #include<queue>
    #include<map>
    #include<bitset>
    #include<stack>
    #include<set>
    #include<vector>
    #include <time.h>
    #include<string.h>
    using namespace std;
    
    typedef long long ll;
    typedef unsigned long long ull;
    typedef double db;
    typedef pair <int, int> pii;
    typedef pair <ll, ll> pll;
    typedef pair <ll, int> pli;
    typedef pair <db, db> pdd;
    
    const int maxn = 1e5+5;
    const int Mod=1000000007;
    const int INF = 0x3f3f3f3f;
    const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
    const double e=exp(1);
    const db PI = acos(-1);
    const db ERR = 1e-10;
    
    #define Se second
    #define Fi first
    #define pb push_back
    #define dbg(x) cout<<#x<<" = "<< (x)<< endl
    #define dbg2(x1,x2) cout<<#x1<<" = "<<x1<<" "<<#x2<<" = "<<x2<<endl
    #define dbg3(x1,x2,x3) cout<<#x1<<" = "<<x1<<" "<<#x2<<" = "<<x2<<" "<<#x3<<" = "<<x3<<endl
    ll gcd_(ll a, ll b)
    {
         return b ==0? a : gcd_(b, a % b);
    }
    int prime[maxn];
    int flag[maxn+5];//素数flag->0
    int mp[maxn];
    int tot;
    void make_prime()
    {
        for(int i=2;i<=300;i++)
        if(!flag[i])
        {
            prime[++tot]=i;
            mp[i]=tot;
            for(int j=i+i;j<=maxn;j+=i)
                flag[j]=1;
        }
    }
    int main()
    {
        make_prime();
        int t;
        scanf("%d",&t);
        while(t--)
        {
            ll a,b;
            scanf("%lld%lld",&a,&b);
            if(gcd_(a,b)==1)
            {
                printf("1\n%lld %lld\n",a,b);
            }
            else if(a%2==1&&b%2==1)
            {
                printf("2\n");
                printf("%lld %lld\n",2,b-2);
                printf("%lld %lld\n",a-2,2);
            }
            else
            {
                ll n=a;
                ll m=b;
                ll tt;
                for(int i=1;i<=15;i++)
                {
                    if((a%prime[i]!=0)&&(b%prime[i]!=0))
                    {
                        tt=prime[i];
                        break;
                    }
                }
                if(tt>=n&&tt>=m)
                {
                    printf("-1\n");
                }
                else
                {
                    if(tt>=n)
                    {
                        ll x1,x2;
                        x2=m-tt;
                        ll tmpx=x2;
                        ll tmptt;
                        for(int i=1;i<=15;i++)
                        {
                            if(tmpx%prime[i]!=0)
                            {
                                tmptt=prime[i];
                                break;
                            }
                        }
                        x1=tmptt;
                        if(n-x1<=1) printf("-1\n");
                        else
                        {
                             printf("2\n");
                             printf("%lld %lld\n",x1,x2);
                             printf("%lld %lld\n",n-x1,m-x2);
                        }
                    }
                    else if(tt>=m)
                    {
                        swap(n,m);
                        ll x1,x2;
                        x2=m-tt;
                        ll tmpx=x2;
                        ll tmptt;
                        for(int i=1;i<=15;i++)
                        {
                            if(tmpx%prime[i]!=0)
                            {
                                tmptt=prime[i];
                                break;
                            }
                        }
                        x1=tmptt;
                        if(n-x1<=1) printf("-1\n");
                        else
                        {
                             printf("2\n");
                             printf("%lld %lld\n",x2,x1);
                             printf("%lld %lld\n",m-x2,n-x1);
                        }
                    }
                    else
                    {
                        printf("2\n");
                        printf("%lld %lld\n",tt,m-tt);
                        printf("%lld %lld\n",n-tt,tt);
                    }
                }
    
            }
        }
        return 0;
    }
    
    

    题意

    做法

    代码

    
    

    题意

    做法

    代码

    
    

    题意

    做法

    代码

    
    

    题意

    做法

    代码

    
    
    展开全文
  • Visual C++ 2008入门经典--详细书签版

    热门讨论 2013-02-02 16:07:15
     ◆ 使用标准模板库(stl)来组织和操作本地c++程序中的数据  ◆ c++程序调试技术..  ◆ 构造microsoft windows应用程序的技术以及每个应用程序的基本元素  ◆ 创建和使用常用控件构建应用程序的图形用户界面  ◆...
  •  ◆ 使用标准模板库(stl)来组织和操作本地c++程序中的数据  ◆ c++程序调试技术..  ◆ 构造microsoft windows应用程序的技术以及每个应用程序的基本元素  ◆ 创建和使用常用控件构建应用程序的图形用户界面  ◆...
  • php高级开发教程说明

    2008-11-27 11:39:22
    方式使你熟悉这一新思想,然后我们从头创建一个A P I,在纸上从理论开发它,并明确一 些实用规则来帮助你实施下一个A P I,例如风格问题、以及商业技巧等。 1.3 编码规范 好编码和差编码之间究竟有何区别...
  • Visual C++ 2005 入门经典 详细书签版

    热门讨论 2013-02-02 16:39:43
    2.3.6 ISO/ANSI C++中的基本类型 49 2.3.7 字面值 50 2.3.8 定义数据类型的同义词 50 2.3.9 具有特定值集的变量 51 2.3.10 指定枚举常量的类型 52 2.4 基本的输入/输出操作 53 2.4.1 键盘输入 53 ...
  • 2.3.6 ISO/ANSI C++中的基本类型 49 2.3.7 字面值 50 2.3.8 定义数据类型的同义词 50 2.3.9 具有特定值集的变量 51 2.3.10 指定枚举常量的类型 52 2.4 基本的输入/输出操作 53 2.4.1 键盘输入 53 ...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    C#--微软.NET的第一语言 本书着重介绍语言本身,比较少涉及应用,不错的入门书,从头讲起,不怕... C#语言在.NET 框架中的作用及其特性 1.1 Microsoft.NET 一场新的革命 1.1.1 什么是.NET 2000 年 6 月 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    C#语言在.NET 框架中的作用及其特性 1.1 Microsoft.NET 一场新的革命 1.1.1 什么是.NET 2000 年 6 月 22 日 不论对 Microsoft 还是对整个 IT 业界都将成为值得纪念的一天 这一天 微软公司正式推出...
  • 2.12.3 赋值语句中的隐式类型转换 54 2.13 再谈数值数据类型 55 2.13.1 字符类型 56 2.13.2 字符的输入输出 57 2.13.3 宽字符类型 60 2.13.4 枚举 60 2.13.5 存储布尔值的变量 63 2.13.6 复数类型 63 2.14 ...
  • 数据结构课设

    2013-01-03 02:51:25
    (2)文件A读入30个无序整数,建立一个递增单链表A并输出,文件B读入30个无序整数,建立一个递增单链表B并输出,在A中求递增并集。 (3)文件读入30个学生成绩(0-100之间),建立一个双向循环链表并...
  • asp.net知识库

    2015-06-18 08:45:45
    SQL中的一个表中导出HTML文件表格 获取數据库表的前N条记录 几段SQL Server语句和存储过程 生成表中的数据的脚本 最详细的SQL注入相关的命令整理 Oracle Oracle中PL/SQL单行函数和组函数详解 mssql+oracle Oracle...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    引用了Splayer中的Sqlite3库,进行了测试。 SrcFirstProg 简单的窗口程序。 SuperGrid - 特别的 listview 控件 网格形式的视图,自绘了CComboBox、CEdit、CSuperGridCtrl实现。 tab 演示了CTabCtrl控件的使用方法...
  • 现在许多源文档可Web获取,有一些文档甚至只能Web获得。出于简洁和可读性方面考虑,本书对Web参考材料采用了一种类似于URL特殊格式,诸如[www.omg.org]和[www.rasecurity.com I)指是仅能Web...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    引用了Splayer中的Sqlite3库,进行了测试。 SrcFirstProg 简单的窗口程序。 SuperGrid - 特别的 listview 控件 网格形式的视图,自绘了CComboBox、CEdit、CSuperGridCtrl实现。 tab 演示了CTabCtrl控件的使用方法...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    引用了Splayer中的Sqlite3库,进行了测试。 SrcFirstProg 简单的窗口程序。 SuperGrid - 特别的 listview 控件 网格形式的视图,自绘了CComboBox、CEdit、CSuperGridCtrl实现。 tab 演示了CTabCtrl控件的使用方法...
  • 在线考试系统文献综述

    热门讨论 2010-05-28 14:57:16
    试卷可以根据题库中的内容即时生成,可避免考试前的压;而且可以采用大量标准化试题,从而使用计算机判卷,大大提高阅卷效率;还可以直接把成绩送到数据库中,进行统计、排序等操作。所以现在较好的考试方法为网络...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    引用了Splayer中的Sqlite3库,进行了测试。 SrcFirstProg 简单的窗口程序。 SuperGrid - 特别的 listview 控件 网格形式的视图,自绘了CComboBox、CEdit、CSuperGridCtrl实现。 tab 演示了CTabCtrl控件的使用方法...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    引用了Splayer中的Sqlite3库,进行了测试。 SrcFirstProg 简单的窗口程序。 SuperGrid - 特别的 listview 控件 网格形式的视图,自绘了CComboBox、CEdit、CSuperGridCtrl实现。 tab 演示了CTabCtrl控件的使用方法...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    引用了Splayer中的Sqlite3库,进行了测试。 SrcFirstProg 简单的窗口程序。 SuperGrid - 特别的 listview 控件 网格形式的视图,自绘了CComboBox、CEdit、CSuperGridCtrl实现。 tab 演示了CTabCtrl控件的使用方法...
  • 功能类似于大名鼎鼎 Octotree ,但是用了更现代化前端工具,性能好很多。 GITHUBER zhuowenli Github仓库地址 这是一个帮助 GitHub 开发者每日发现优质内容 Chrome 主页拓展。 内容同步更新到公众号...
  • 2.12.3 赋值语句中的隐式类型转换 54 2.13 再谈数值数据类型 55 2.13.1 字符类型 56 2.13.2 字符的输入输出 57 2.13.3 宽字符类型 60 2.13.4 枚举 60 2.13.5 存储布尔值的变量 63 2.13.6 复数类型 63 2.14 ...
  • mahara教师评价系统

    2014-12-31 16:14:43
    实现 moodle 到 mahara 漫游 在角色管理里面点击授权用户右面 edit,打开用户权限配置界面如下,设置云允许漫游到 远程站点。 在首页添加新模块(网络服务器) ,就可以添加一个到选择 mahara 链接。 点击该...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

从上题中的站点a