题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2662
怎么说呢,这道题逻辑推理不错,可以找规律,也可以证明结论。我举了几个例子后,推出了公式....
题意:给你两种素数,每种素数的个数不限,问你哪个数字后所有的数字都可以通过这两种素数组合构成
比如:
3 5
那么7数字后的所有数字都可以由这两种素数组合成
5 7
一个一个的推的话,我们会发现是35
7 9
同样一个一个的推,虽然比较麻烦,不过没办法。我们会发现47以后的所有数字都可以组合构成
下面是我的AC代码:
#include<iostream>
#define ll long long
using namespace std;
int main()
{
ll t,n,m;
cin>>t;
while(t--)
{
ll ans;
cin>>n>>m;
ans=n*m-m-n;
cout<<ans<<endl;
}
return 0;
}
关于公式:我们在这里证明一下
设所求为n,那么n+a、n+b可以用a、b线性表出,而n不可。
所以 n+a=x1*a+y1*b,n+b=x2*a+y2*b
所以 n=(x1-1)*a+y1*b n=x2*a+(y2-1)*b
因为n不能被线性表出,所以x1=0,y2=0
所以 n+a=y1*b,n+b=x2*a
所以 n+a=y1*b,n+a=(x2+1)*a-b
所以 (x2+1)*a-b是b的倍数
因为a、b互质,所以(x2+1)是b的倍数
因为求最小的n,所以选最小的x2值,所以取(x2+1)为b
所以 n+a=b*a-b,n=a*b-a-b
证毕