4 solutions

  • 0
    @ 2022-3-16 21:59:52

    网上搜了一下题解 发现了一个巧妙的 用了数论 拓展欧几里得定理

    自然数a,b互质,则不能表示成ax+by(x,y为非负整数)的最大整数是ab-a-b. 证明: a或者b是1的情况下容易证明. 以下情况都是a>1且b>1的情况. 首先证明ab-a-b不能表示成ax+by 假设ab-a-b=ax+by,那么ab=am+bn (m,n都大于等于1) 左边是a的倍数,右边am是a的倍数,那么要求bn也要是a的倍数 b不是a的倍数,只能要求n是a的倍数,这样的话,bn=bn’a>=ba 那么am=ab-bn<=0就与am>1矛盾.

    #include<iostream>
    
    
    
    using namespace std;
    
    
    
    int main()
    
    {
    
    
    
        int a,b;
    
        cin>>a>>b;
    
        cout<<a*b-a-b<<endl;
    
    
    
    }
    
    • 0
      @ 2022-3-16 21:50:01
      #include<bits/stdc++.h>
      using namespace std;
      int a,b;
      int search(int x)
      {
      	int ans=0;
      	for(int i=0;i<=b;i++)
      	{
      		for(int j=0;j<=a;j++)
      		{
      			if(i*a+b*j==x){
      				ans++;
      				break;
      			}
      		}
      	}
      	if(ans)
      		return 0;
      	else
      		return 1;
      }
      int main()
      {
      	std::ios::sync_with_stdio(false);
      	cin>>a>>b;
      	int k=a*b;
      	for(int i=k;i>0;i--)
      	{
      		if(search(i)){
      			cout<<i;
      			break;
      		}
      	}
      	return 0;
      }
      
      • 0
        @ 2022-3-16 19:54:41
        #include<iostream>
        
        
        using namespace std;
        const int N = 1e6 + 5;
        bool flag[N];
        
        int main(void)
        {
        	int j, k;
        
        
        	cin >> j >> k;
        	int d = j * k / __gcd(j, k);
        
        	for (int i = 0; i < d; i++)//关于i和取的边界不用纠结
        	{
        		for (int t = 0; t < d; t++)
        		{
        			if (i * j + k * t > d) break;
        			flag[i * j + k * t] = 1;
        		}
        	}
        
        	for (int i = d; i > 0; i--)//从后向前遍历找到第一个false即所求
        	{
        		if (!flag[i])
        		{
        			cout << i << endl;
        			break;
        		}
        
        	}
        
        
        	return 0;
        }
        
        • 0
          @ 2022-3-16 16:07:49

          找规律的题,自己找到一组即可发现规律(大佬应该有更好的打法),写一个bool的数组将n,m标记,分别标记n+n,n+m,n+n+n...,规律就是往前数数到i前一个不被标记,其他都被标记i+1即是所求数

          #include<iostream>
          #define INF 0x3f3f3f3f
          using namespace std;
          const int N=1e7+7;
          int n,m;
          bool v[N];
          bool check(int x,int ma){
          	if(v[x+1])return false;
          	for(int i=x+2;i<=ma;i++)if(!v[i])return false;
          	return true;
          }
          int main(){
          	int ma=-INF;
          	cin>>n>>m;
          	v[n]=true,v[m]=true;
          	if(n>m)swap(n,m);
          	for(int i=n;i<N;i++){
          		if(!v[i])continue;
          		else {
          			v[i+n]=true;
          			v[i+m]=true;
          			ma=max(i+m,ma);
          		}
          		if(check(i,ma)){
          			cout<<i+1;
          			break;
          		}
          	}
          	return 0;
          }
          
          • 1

          Information

          ID
          1588
          Time
          1000ms
          Memory
          256MiB
          Difficulty
          3
          Tags
          # Submissions
          43
          Accepted
          25
          Uploaded By