Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

为什么SPJ过不了?答案应该是正确的

Posted by twang at 2010-02-18 09:56:36 on Problem 1426
所有的情况都验证过了,为什么始终报WA?
我的程序输出是:
n       m
---------------------------
1	1
2	10
3	111
4	100
5	10
6	1110
7	1001
8	1000
9	111111111
10	10
11	11
12	11100
13	1001
14	10010
15	1110
16	10000
17	11101
18	1111111110
19	11001
20	100
21	10101
22	110
23	110101
24	111000
25	100
26	10010
27	1101111111
28	100100
29	1101101
30	1110
31	111011
32	100000
33	111111
34	111010
35	10010
36	11111111100
37	111
38	110010
39	10101
40	1000
41	11111
42	101010
43	1101101
44	1100
45	1111111110
46	1101010
47	10011
48	1110000
49	1100001
50	100
51	100011
52	100100
53	100011
54	11011111110
55	110
56	1001000
57	11001
58	11011010
59	11011111
60	11100
61	100101
62	1110110
63	1111011111
64	1000000
65	10010
66	1111110
67	1101011
68	1110100
69	10000101
70	10010
71	10011
72	111111111000
73	10001
74	1110
75	11100
76	1100100
77	1001
78	101010
79	10010011
80	10000
81	1111111101
82	111110
83	101011
84	1010100
85	111010
86	11011010
87	11010111
88	11000
89	11010101
90	1111111110
91	1001
92	11010100
93	10000011
94	100110
95	110010
96	11100000
97	11100001
98	11000010
99	111111111111111111
100	100
101	101
102	1000110
103	11100001
104	1001000
105	101010
106	1000110
107	100010011
108	110111111100
109	1001010111
110	110
111	111
112	10010000
113	1011011
114	110010
115	1101010
116	110110100
117	11101110111
118	110111110
119	100111011
120	111000
121	11011
122	1001010
123	111111111111111
124	11101100
125	1000
126	11110111110
127	11010011
128	10000000
129	100100001
130	10010
131	101001
132	11111100
133	11101111
134	11010110
135	11011111110
136	11101000
137	10001
138	100001010
139	110110101
140	100100
141	10011
142	100110
143	1001
144	1111111110000
145	11011010
146	100010
147	1100001
148	11100
149	110111
150	11100
151	1110001
152	11001000
153	111111111000000000000000111111111
154	10010
155	1110110
156	1010100
157	1000000000000000000000000000000000000001
158	100100110
159	100011
160	100000
161	11101111
162	11111111010
163	1010111
164	1111100
165	1111110
166	1010110
167	11111011
168	10101000
169	10111101
170	111010
171	1111011111
172	110110100
173	1011001101
174	110101110
175	100100
176	110000
177	100101111
178	110101010
179	11010111
180	11111111100
181	1001111
182	10010
183	100101
184	110101000
185	1110
186	100000110
187	1001011
188	1001100
189	1101111111000001101111111
190	110010
191	11101111
192	111000000
193	11001
194	111000010
195	101010
196	110000100
197	1101000101
198	1111111111111111110
199	111000011
200	1000
-------------------------------
附程序(Java)

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.math.BigInteger;

public class Main {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws Exception {

		InputStream input = null;
		input = System.in;
		
		BufferedReader stdin = new BufferedReader(new InputStreamReader(input));

		StringBuffer sb = new StringBuffer();
		String line = stdin.readLine();
		while (line != null && !"0".equals(line)) {
			int n = Integer.valueOf(line);
			BigInteger t = f(n);
			sb.append(t.toString()).append("\n");
			line = stdin.readLine();
		}
		System.out.println(sb);
	}

	/**
	 * 返回形如A*(10^m-1)/(10^k-1)的位数不超过100的n的倍数。 
	 * 其中A各位都是0,1且不超过k位数,m是k的倍数。
	 * @param n
	 * @return
	 */
	private static BigInteger f(int n) {
		
		int pow2 = 0;
		while (n%2 == 0) {
			pow2 ++;
			n /= 2;
		}
		int pow5 = 0;
		while (n%5 == 0) {
			pow5 ++;
			n /= 5;
		}
		int p = Math.max(pow2, pow5);
		int d = d(n);
		BigInteger N = BigInteger.valueOf(n);

		int t = 1;
		while (t < 200/d+1) {
			int w = d*t;
			BigInteger x = BigInteger.TEN.pow(w).subtract(BigInteger.ONE);
			for (int k = w; k > 0; k --) {
				if (w%k == 0) {
					for (int a = 1; a < Math.pow(2, Math.min(10, k)); a ++) {
						BigInteger A = new BigInteger(Integer.toBinaryString(a)); 
						BigInteger y = BigInteger.TEN.pow(k).subtract(BigInteger.ONE);
						BigInteger z = x.divide(y).multiply(A);
						if (z.mod(N).compareTo(BigInteger.ZERO) == 0) { 
							z = z.multiply(BigInteger.TEN.pow(p));
							if (z.toString().length() < 100) {
								return z;
							}
						}
					}
				}
			}
			t ++;
		}
		return BigInteger.valueOf(-1);
	}
	
	private static int[] ps = new int[] {
		2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 
		53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 
		109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 
		173, 179, 181, 191, 193, 197, 199 
	};
	
	private static int phi(int n) {
		
		int m = n;
		for (int i = 0; i < ps.length; i ++) {
			if (n%ps[i] == 0) m = m/ps[i]*(ps[i]-1);
		}
		return m;
	}
	
	private static int d(int n) {
		
		int m = phi(n);
		BigInteger N = BigInteger.valueOf(n);
		for (int i = 1; i <= m; i ++) {
			if (m%i == 0) {
				BigInteger w = BigInteger.TEN.pow(i).subtract(BigInteger.ONE);
				if (w.mod(N).compareTo(BigInteger.ZERO) == 0) {
					return i;
				}
			}
		}
		return -1;
	}
}


Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator