【题目描述】
已知整数X、Y满足如下列条件:
①Ax+By+C = 0;
②P <= X <= Q;
③R <= Y <= S;
求满足条件的X、Y个数。
【输入描述】
第一行输入一个整数n(n <= 10),表示有n个任务;
接下来n行,每行输入七个整数A、B、C、P、Q、R、S,均不超过108。
【输出描述】
输出n行,每行包含一个数,表示答案。
【样例输入】
2
2 3 -7 0 10 0 10
1 1 1 -10 10 -9 9
【样例输出】
1
19
枚举:
源代码: #include<iostream> using namespace std; long long n; //注意Long Long。 int main() { cin>>n; for (int a=1;a<=n;a++) { long long t1,t2,t3,left1,right1,left2,right2,ans(0); cin>>t1>>t2>>t3>>left1>>right1>>left2>>right2; if (t2==0) //特判0。 { for (int b=left1;b<=right1;b++) //就是枚举,任性。 if (b*t1==-t3) ans++; cout<<ans*(right2-left2+1)<<endl; } else { for (int b=left1;b<=right1;b++) if ((-t3-t1*b)%t2==0&&(-t3-t1*b)*1.0/t2>=left2&&(-t3-t1*b)*1.0/t2<=right2) //就是枚举! ans++; cout<<ans<<endl; } } return 0; }
拓展欧几里得:
源代码: #include<cmath> #include<iostream> #include<algorithm> using namespace std; double z[4]; void exgcd(long long t1,long long t2,long long &d,long long &x,long long &y) { if (!t2) { d=t1; x=1; y=0; return; } exgcd(t2,t1%t2,d,y,x); y-=x*(t1/t2); return; } int main() { long long t1,t2,t3,left1,right1,left2,right2,x,y,d,k; //d为最大公约数, int n; cin>>n; while (n--) { cin>>t1>>t2>>t3>>left1>>right1>>left2>>right2; t3=-t3; if (left1>right1||left2>right2||(!t1&&!t2&&t3)) //特判。 { cout<<0<<endl; continue; } if (!t1||!t2) //特判。 { if (!t1) //还他娘的是特判。 t1=right1-left1+1; else if (t3%t1==0&&(t3/t1)<=right1&&(t3/t1)>=left1) t1=1; else t1=0; if (!t2) t2=right2-left2+1; else if (t3%t2==0&&(t3/t2)<=right2&&(t3/t2)>=left2) t2=1; else t2=0; cout<<t1*t2<<endl; continue; } exgcd(t1,t2,d,x,y); if (t3%d!=0) { cout<<0<<endl; continue; } k=t3/d; x*=k; y*=k; t1=t1/d; t2=t2/d; z[0]=(right1-x)*1.0/t2; z[1]=(left1-x)*1.0/t2; z[2]=(y-right2)*1.0/t1; z[3]=(y-left2)*1.0/t1; sort(z,z+4); t1=floor(z[2]); t2=ceil(z[1]); cout<<t1-t2+1<<endl; } return 0; }