[CSP-S模拟测试]:Simple(数学)
题目描述
对于给定正整数$n,m$,我们称正整数$c$为好的,当且仅当存在非负整数$x,y$,使得$n\times x+m\times y=c$。
现在给出多组数据,对于每组数据,给定$n,m,q$,求$[1,q]$内有多少个正整数不是好的。
输入格式
第一行,一个整数$T$表示数据组数。
接下来每行三个数,分别表示$n,m,q$,即一组询问。
输出格式
对于每组数据,输出一行表示答案。
样例
样例输入:
2
78 100 4
70 3 34
样例输出:
4
23
数据范围与提示
对于$30\%$的数据,$n,m,q\leqslant 100$。
对于$60\%$的数据,$n,m,q\leqslant 10^5$。
对于$100\%$的数据,$n\leqslant 10^5,m\leqslant 10^9,q\leqslant 10^{18},T\leqslant 10$。
题解
求不等式解的个数,我们可以将$n$和$m$都除$gcd(n,m)$,这样是不会影响解的个数的。
然后可能会想到赛瓦维斯特定理,不知道的话帮我刷个浏览量呗~
利用贝祖定理,我们只需要枚举$y\in [0,n-1]$,那么$y\times m-x\times n$在$[1,q]$之间的数一定是不好的。
注意一些边界问题就好了。
时间复杂度:$\Theta(n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long q;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%lld",&n,&m,&q);
long long ans=q+1;
for(int i=0;i<n/__gcd(n,m);++i)
{
if(q-1LL*i*m<0)break;
ans-=((q-1LL*i*m)/n)+1;
}
printf("%lld\n",ans);
}
return 0;
}
rp++