题意:这题题目有点长,不过很清楚,看懂后就可以推出一个公式 S = y(6y + 7x) ,即 S = 6y^2 + 7xy,所以S < sqrt(6y^2),所以就直接枚举S的因子就行,当然,预处理出素数然后求素因子合并自然更快,不过太麻烦了。结果要按最初的x从大到小排序,由于y是从小到大枚举的,所以x自然已经是从大到小了,可以直接输出。
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define LL long long
const int mod = 100000007;
LL ans[1111111];
bool cmp(const LL a, const LL b) {
return a > b;
}
int main() {
LL i, s;
while(scanf("%lld", &s) != -1 && s) {
int ok = 0;
for(i = 1;i <= sqrt(s/6+0.5); i++) {
if(s%i == 0) {
if((s/i-i*6)%7 == 0) {
LL cur = (s/i-i*6)/7;
if(cur <= 0) continue;
ok = 1;
cur %= mod;
printf("Possible Missing Soldiers = %lld\n", cur%mod*cur%mod*2%mod);
}
}
}
if(!ok)
puts("No Solution Possible");
puts("");
}
return 0;
}