链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2485
题解
假设正方形的边长为
n
n
n,边界的宽度为
k
k
k
那么
(
3
k
+
2
n
)
(
2
k
+
n
)
=
S
+
2
n
2
(3k+2n)(2k+n)=S+2n^2
(3k+2n)(2k+n)=S+2n2
6
k
2
+
7
n
k
+
2
n
2
=
S
+
2
n
2
6k^2+7nk+2n^2=S+2n^2
6k2+7nk+2n2=S+2n2
6
k
2
+
7
n
k
=
S
6k^2+7nk=S
6k2+7nk=S
k
(
6
k
+
7
n
)
=
S
k(6k+7n)=S
k(6k+7n)=S
枚举
S
S
S的约数就行了
注意模数是
1
0
8
+
7
10^8+7
108+7而不是
1
0
9
+
7
10^9+7
109+7
代码
#include <bits/stdc++.h>
#define ll long long
#define maxn 1000010
#define mod 100000007ll
using namespace std;
ll lis[maxn];
void solve(ll S)
{
ll k, n, i;
*lis=0;
for(i=1;i*i<=S;i++)
if(S%i==0)
{
k=i;
if((S/k-6*k)%7==0)
{
n=(S/k-6*k)/7;
if(n>0)lis[++*lis]=n;
}
if(i*i==S)continue;
k=S/i;
if((S/k-6*k)%7==0)
{
n=(S/k-6*k)/7;
if(n>0)lis[++*lis]=n;
}
}
sort(lis+1,lis+*lis+1);
for(i=*lis;i;i--)
printf("Possible Missing Soldiers = %lld\n",(lis[i]%mod)*(lis[i]%mod)*2%mod);
if(*lis==0)printf("No Solution Possible\n");
putchar(10);
}
int main()
{
ll S;
while(scanf("%lld",&S),S)solve(S);
return 0;
}