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

  • 相关阅读:
    自建 IPA 分发平台
    一个优雅的占位图解决方案。适用于 UITableView 和 UICollectionView。
    Vuejs2.0购物车和地址选配学习笔记
    UIWebView 加 MJRefresh 同时解决底部黑影问题
    UIWebView 不自动全屏播放视频
    左右分页按钮的集合视图控件。用于快速编写出集合视图上分页多按钮点击事件!
    课程总结
    IO流实训
    事件处理
    变色
  • 原文地址:https://www.cnblogs.com/wzc521/p/11644359.html
Copyright © 2020-2023  润新知