[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++

posted @ 2019-10-09 21:02  HEOI-动动  阅读(287)  评论(0编辑  收藏  举报