题意:(注意题目中的%是指mod)开始给了你n, k, m。。。。每次由+m, -m, *m, modm得到新的N,继续对N这样的操作,直到(n+1) mod k== N mod k时结束。。。并且打印路径
%与mod的区别:%出来的数有正有负,符号取决于左操作数。。。而mod只能是正(因为a = b * q + r (q > 0 and 0 <= r < q), then we have a mod q = r 中r要大于等于0小于q)。。。。。
所以要用%来计算mod的话就要用这样的公式:a mod b = (a % b + b) % b
括号里的目的是把左操作数转成正数
由于新的N可以很大,所以我们每一步都要取%,而且最后要mod k,正常来说每步都%k就行了,但是由于其中的一个操作是N%m,所以我们每一步就不能%k了(%k%m混用会导致%出来的答案错误),而要%(k *m);
思路: 用BFS(广度优先搜索)
import java.io.*; import java.util.*; /* * @author denghuilong * * 2013-8-14下午5:08:37 * */ public class Main { public String str="+-*%"; public int n,m,k,sum,km; public boolean boo[]=new boolean[1000*1000*10+1]; public Queue<Node1> list=new LinkedList<Node1>(); public static void main(String[] args) { new Main().work(); } public void work(){ Scanner sc=new Scanner(new BufferedInputStream(System.in)); while(sc.hasNext()){ list.clear(); Arrays.fill(boo,false); n=sc.nextInt(); k=sc.nextInt(); m=sc.nextInt(); if(n==0&&k==0&&m==0) System.exit(0); Node1 node=new Node1(); node.n=n; node.s=""; sum=getMode(n+1,k); km=m*k; boo[getMode(n,km)]=true; list.add(node); BFS(); } } public void BFS(){ while(!list.isEmpty()){ Node1 node=list.poll(); if(getMode(node.n,k)==sum){ System.out.println(node.s.length()); System.out.println(node.s); return; } for(int i=0;i<str.length();i++){ int temp=0; if(str.charAt(i)=='+'){ temp=getMode(node.n+m,km); } else if(str.charAt(i)=='-'){ temp=getMode(node.n-m,km); } else if(str.charAt(i)=='*'){ temp=getMode(node.n*m,km); } else if(str.charAt(i)=='%'){ temp=getMode(getMode(node.n,m),km); } if(!boo[temp]){ boo[temp]=true; Node1 t=node.getNode(); t.n=temp; t.s=t.s+str.charAt(i); list.add(t); } } } System.out.println(0); } public int getMode(int a,int b){ return (a%b+b)%b; } } class Node1{ int n; String s; Node1(){ n=0; s=""; } public Node1 getNode(){ Node1 node=new Node1(); node.n=0; node.s=s; return node; } }