#include <bits/stdc++.h> using namespace std; #define REP(i,a,b) for (int i = (a); i <= (b); ++i) #define REPD(i,a,b) for (int i = (a); i >= (b); --i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair<int,int> #define vi vector<int> #define ll long long #define SZ(x) int((x).size()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++) #define fi first #define se second const int N = 333; const ll mod = 1LL<<32; ll dp[N][N]; vector<pii> ps; ll S[N][N]; int main() { int sb=1, sab=1; dp[0][0] = dp[1][0] = 1; int X, Y, K; scanf("%d%d%d", &X, &Y, &K); //ps.pb(mp(0,1)); for (int a = 1; a <= 250; a++) for (int b = a+1; b <= 250; b++) { if (__gcd(a,b) > 1) continue; int c = sqrt(a*a+b*b); if (c <= K && c*c == a*a+b*b) { for (int i = N-1; i >= 0; i--) for (int j = N-1; j >= 0; j--) if (dp[i][j]) { if (i+a < N && j+b < N) dp[i+a][j+b] += dp[i][j]; } for (int i = N-1; i >= 0; i--) for (int j = N-1; j >= 0; j--) if (dp[i][j]) { if (i+b < N && j+a < N) dp[i+b][j+a] += dp[i][j]; } sb += b; sab += a+b; //printf("%d %d %d\n", a, b, c); ps.pb(mp(a,b)); } } //printf("sum = %d %d\n", sb, sab); int xn = min(X, sab*2+1), yn = min(Y, sab*2+1); ll res = 0; for (int a=1; a<xn; a++) { FOR(i,yn) FOR(j,yn) { S[i][j] = 0; FOR(k,a+1) { S[i][j] += dp[i][k] * dp[a-k][j]%mod; } //if (S[i][j]>0) printf("%d : S[%d][%d] = %lld\n", a, i, j, S[i][j]); } for (int b=1; b<yn; b++) { FOR(i,b+1) FOR(j,b+1) { //if (S[i][j] * S[b-j][b-i]>0) printf("%dx%d : adding %lld (%d %d)\n", a, b, S[i][j] * S[b-j][b-i], i, j); res += (X-a) * (Y-b) * S[i][j] * S[b-j][b-i]%mod; } } } FOR(i,SZ(ps)) { int a = ps[i].fi, b = ps[i].se; if (a<=X && b<=Y) res -= 2LL * (X-a) * (Y-b)%mod; a = ps[i].se, b = ps[i].fi; if (a<=X && b<=Y) res -= 2LL * (X-a) * (Y-b)%mod; } res %= mod; if (res<0) res+=mod; printf("%lld\n", res %(1LL<<32)); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <bits/stdc++.h> using namespace std; #define REP(i,a,b) for (int i = (a); i <= (b); ++i) #define REPD(i,a,b) for (int i = (a); i >= (b); --i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair<int,int> #define vi vector<int> #define ll long long #define SZ(x) int((x).size()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++) #define fi first #define se second const int N = 333; const ll mod = 1LL<<32; ll dp[N][N]; vector<pii> ps; ll S[N][N]; int main() { int sb=1, sab=1; dp[0][0] = dp[1][0] = 1; int X, Y, K; scanf("%d%d%d", &X, &Y, &K); //ps.pb(mp(0,1)); for (int a = 1; a <= 250; a++) for (int b = a+1; b <= 250; b++) { if (__gcd(a,b) > 1) continue; int c = sqrt(a*a+b*b); if (c <= K && c*c == a*a+b*b) { for (int i = N-1; i >= 0; i--) for (int j = N-1; j >= 0; j--) if (dp[i][j]) { if (i+a < N && j+b < N) dp[i+a][j+b] += dp[i][j]; } for (int i = N-1; i >= 0; i--) for (int j = N-1; j >= 0; j--) if (dp[i][j]) { if (i+b < N && j+a < N) dp[i+b][j+a] += dp[i][j]; } sb += b; sab += a+b; //printf("%d %d %d\n", a, b, c); ps.pb(mp(a,b)); } } //printf("sum = %d %d\n", sb, sab); int xn = min(X, sab*2+1), yn = min(Y, sab*2+1); ll res = 0; for (int a=1; a<xn; a++) { FOR(i,yn) FOR(j,yn) { S[i][j] = 0; FOR(k,a+1) { S[i][j] += dp[i][k] * dp[a-k][j]%mod; } //if (S[i][j]>0) printf("%d : S[%d][%d] = %lld\n", a, i, j, S[i][j]); } for (int b=1; b<yn; b++) { FOR(i,b+1) FOR(j,b+1) { //if (S[i][j] * S[b-j][b-i]>0) printf("%dx%d : adding %lld (%d %d)\n", a, b, S[i][j] * S[b-j][b-i], i, j); res += (X-a) * (Y-b) * S[i][j] * S[b-j][b-i]%mod; } } } FOR(i,SZ(ps)) { int a = ps[i].fi, b = ps[i].se; if (a<=X && b<=Y) res -= 2LL * (X-a) * (Y-b)%mod; a = ps[i].se, b = ps[i].fi; if (a<=X && b<=Y) res -= 2LL * (X-a) * (Y-b)%mod; } res %= mod; if (res<0) res+=mod; printf("%lld\n", res %(1LL<<32)); return 0; } |