4 solutions
-
0
网上搜了一下题解 发现了一个巧妙的 用了数论 拓展欧几里得定理
自然数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
#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
#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
找规律的题,自己找到一组即可发现规律(大佬应该有更好的打法),写一个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