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 }


浙公网安备 33010602011771号