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

  • 相关阅读:
    Spark Streaming 调优指南
    Hive实战之Youtube数据集
    【源码解析】BlockManager详解
    Spark操作HBase问题:java.io.IOException: Non-increasing Bloom keys
    Spark实战之读写HBase
    ZooKeeper的简单理解
    Flume-ng源码解析之Source组件
    Flume-ng源码解析之Sink组件
    Flume-ng源码解析之Channel组件
    Flume-ng源码解析之启动流程
  • 原文地址:https://www.cnblogs.com/wzc521/p/11644359.html
Copyright © 2011-2022 走看看