qwb與整數對
阿新 • • 發佈:2017-06-03
vector 一行 amp 表示 cas 結果 clas 測試 ans
qwb與整數對
Time Limit: 1 Sec Memory Limit: 128 MBDescription
qwb又遇到了一道數學難題,你能幫助他嗎?
給出兩個整數n和m,請統計滿足0<a<b<n並且使得 (a2+b2+m)/(ab) 的結果是整數的整數對(a,b)的個數。
Input
本題包含多組測試例 。當測試例數據是n=m=0時,表示輸入結束。(測試例數量<6000)
每個測試例一行,是兩個整數n和m。輸入保證0≤n≤1000,-20000<m<20000。
Output
對每個測試例,輸出測試例的編號(Case X:Y) 以及滿足上述要求的整數對(a,b)的個數,輸出格式如樣例輸出所示。
Sample Input
10 1
20 3
30 4
0 0
Sample Output
Case 1: 2
Case 2: 4
Case 3: 5
分析:枚舉a,b及a*b的倍數就好了呢;
開個1000*40000的數組會MLE,只能離線查詢了;
代碼:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include<cstring> #include <string> #include <set> #include <bitset> #include <map> #include <queue> #include <stack> #include <vector> #include <cassert> #include <ctime> #include<unordered_map> #define rep(i,m,n) for(i=m;i<=n;i++) #definemod 1000000007 #define inf 0x3f3f3f3f #define vi vector<int> #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) #define pii pair<int,int> #define sys system("pause") const int maxn=4e4+10; const int N=5e2+10; using namespace std; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p%mod;p=p*p%mod;q>>=1;}return f;} int n,m,k,t,ret[maxn],ans[maxn],cnt; vector<pii>qu[maxn]; int main() { int i,j; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; qu[n].pb(mp(m,++cnt)); } rep(i,1,1000) { for(j=0;j<qu[i].size();j++) { ans[qu[i][j].se]=ret[qu[i][j].fi+20000]; } rep(j,1,i-1) { int t; if(i*i+j*j<20000)t=(i*i+j*j-20000)/(i*j); else t=(i*i+j*j-20000+i*j-1)/(i*j); for(k=(i*i+j*j+20000)/(i*j);t<=k;t++) { int pos=t*i*j-i*i-j*j; ret[pos+20000]++; } } } rep(i,1,cnt)printf("Case %d: %d\n",i,ans[i]); return 0; }
qwb與整數對