11490 - Just Another Problem

因为缺少的士兵是两个正方形, 我们设 N = 2 * n^2,表示缺失的人数,r表示宽度, 根据题意则有

          S + N = (3r + 2n) * (2r + n)

     -> S + N = 6r^2 + 7rn + 2n^2

     -> S = 6r^2 + 7rn = r(6r + 7n)

所以r整除S, 可以枚举S的约数, 来求出n。

由于最后要求按原来的值从大到小排序, 我们可以发现r越大,n就会越小, 所以只要按照r递增的顺序计算的话最后的答案就是从大到小按原值排的序, 再注意余数判重就是了。

View Code
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<vector>
 5 #include<set>
 6 #include<algorithm>
 7 using namespace std;
 8 
 9 typedef long long ll;
10 const ll maxn = 1000000 + 10;
11 const ll mod = 100000007;
12 
13 
14 ll prime[maxn], plen;
15 bool vis[maxn];
16 ll s;
17 vector<ll>ans;
18 void mklist() {
19     memset(vis, false, sizeof(vis));
20     plen = 0;
21     for(int i = 2; i * i < maxn; ++i) {
22         if(!vis[i]) {
23             for(int j = i; j * i < maxn; ++j) vis[i * j] = true;
24         }
25     }
26     for(int i = 2; i < maxn; ++i) if(!vis[i]) prime[plen++] = i;
27 }
28 
29 ll fac[100][2], flen;
30 void split(ll n) {
31     flen = 0;
32     for(int i = 0; i < plen && prime[i] <= n; ++i) {
33         if(n % prime[i] == 0) {
34             fac[flen][0] = prime[i];
35             fac[flen][1] = 0;
36             while(n % prime[i] == 0) {
37                 n /= prime[i];
38                 fac[flen][1]++;
39             }
40             ++flen;
41         }
42     }
43     if(n > 1) {
44         fac[flen][0] = n;
45         fac[flen][1] = 1;
46         ++flen;
47     }
48 }
49 
50 ll cal(ll i) {
51     ll ans = s - 6 * i * i;
52     if(ans > 0 && ans % (7 * i) == 0) {
53         ans = ans / (7 * i);
54         return (2 * ans % mod * (ans % mod)) % mod;
55     }
56     return -1;
57 }
58 void dfs(int d, ll sum) {
59     if(d == flen) {
60          ans.push_back(sum);
61         return;
62     }
63     ll t = 1;
64     for(int i = 0; i <= fac[d][1]; ++i) {
65         dfs(d + 1, sum * t);
66         t *= fac[d][0];
67     }
68 }
69 
70 int main() {
71     mklist();
72     while(cin >> s && s) {
73         split(s);
74         ans.clear();
75         dfs(0, 1);
76         vector<ll>ret;
77         set<ll>hash;
78         sort(ans.begin(), ans.end());
79         for(int i = 0; i < ans.size(); ++i) {
80             ll tmp = cal(ans[i]);
81             if(tmp > -1 && hash.find(ans[i]) == hash.end()){
82                        ret.push_back(tmp);
83                 hash.insert(tmp);
84             }
85         }
86         if(ret.size() == 0) {
87             cout << "No Solution Possible" << endl;
88         } else {
89             for(int i= 0; i < ret.size(); ++i) {
90                 cout << "Possible Missing Soldiers = " << ret[i] << endl;
91             }
92         }
93         cout << endl;
94     }
95     return 0;
96 }

 

posted @ 2013-01-29 20:20  ACSeed  Views(81)  Comments(0)    收藏  举报