zoukankan      html  css  js  c++  java
  • [CSP-S模拟测试]:Simple(数学)

    题目描述

      对于给定正整数$n,m$,我们称正整数$c$为好的,当且仅当存在非负整数$x,y$,使得$n imes x+m imes y=c$。
      现在给出多组数据,对于每组数据,给定$n,m,q$,求$[1,q]$内有多少个正整数不是好的。


    输入格式

    第一行,一个整数$T$表示数据组数。
    接下来每行三个数,分别表示$n,m,q$,即一组询问。


    输出格式

    对于每组数据,输出一行表示答案。


    样例

    样例输入:

    2
    78 100 4
    70 3 34

    样例输出:

    4
    23


    数据范围与提示

    对于$30\%$的数据,$n,m,qleqslant 100$。
    对于$60\%$的数据,$n,m,qleqslant 10^5$。
    对于$100\%$的数据,$nleqslant 10^5,mleqslant 10^9,qleqslant 10^{18},Tleqslant 10$。


    题解

    求不等式解的个数,我们可以将$n$和$m$都除$gcd(n,m)$,这样是不会影响解的个数的。

    然后可能会想到赛瓦维斯特定理,不知道的话帮我刷个浏览量呗~

    利用贝祖定理,我们只需要枚举$yin [0,n-1]$,那么$y imes m-x imes 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
    ",ans);
    	}
    	return 0;
    }
    

    rp++

  • 相关阅读:
    字串变换
    单词接龙
    二叉搜索树
    搜索专题(未完)
    单调栈
    单调队列练习(切蛋糕&好消息,坏消息)
    队列专题
    滑动窗口/【模板】单调队列
    Linux下如何查看硬件信息?
    Git 居然可以用来跟女神聊天?
  • 原文地址:https://www.cnblogs.com/wzc521/p/11644359.html
Copyright © 2011-2022 走看看