A - Last CardA - Last Card


题目大意
一共 K 张卡片分发给 N 个人,这些人的编号为 1, 2, …, N
从第 A 个人开始,按照顺序依次将卡片发给以下人员:A, A+1, A+2, …, N, 1, 2, …问最后一个卡片将发给哪个人?
具体来说,当第 x(1≤x
思路分析
取模时特判一下ans==0的情况
ans = (a + k - 1) % n
时间复杂度
O(1)
AC代码
#include
using namespace std;
int main(){
int n, k, a;
cin >> n >> k >> a;
int ans = (a + k - 1) % n;
if(ans == 0) ans = n;
cout << ans << endl;
return 0;
}
B - KEYENCE buildingB - KEYENCE building



题目大意
判断有多少个人的猜测肯定是错误的。根据所给的建筑面积公式4ab+3a+3b。如果存在一组a和b使得计算出的面积等于某个人的猜测面积,则说明该人的猜测是正确的。
思路分析
因为数据范围小,所以可以通过枚举a和b的值来计算出可能的建筑面积。
时间复杂度
O(N2)
AC代码
#include
using namespace std;
int main(){
int n;
int s[99];
cin>>n;
for(int i=0; i<n; i++){
cin>>s[i];
}
int ans = 0;
for(int i=0; i<n; i++){
bool fl = false;
for(int a=1; a<=1000; a++){
for(int b=1; b<=1000; b++){
if(4*a*b + 3*a + 3*b == s[i]){
fl = true;
break;
}
}
if(fl){
break;
}
}
if(!fl){
ans++;
}
}
cout<<ans<<endl;
return 0;
}
C - ABC conjectureC - ABC conjecture


题目大意
给定一个正整数N,找出满足条件A≤B≤C和ABC≤N的三个正整数(A, B, C)的个数。
思路分析
因为是不等式,所以枚举确定两个数后,便知道第三个数的取值范围。
- 首先,可以观察到A、B、C都是从1开始递增的。
- 其次,可以发现,当固定A和B时,C的最大值为N/(A*B)。
- 因此,可以使用两个循环来遍历所有可能的A和B的取值范围,并在每次循环中计算满足条件的C的个数。
- 最后,将所有的满足条件的(A, B, C)个数相加即可得到答案。
时间复杂度
O(√N)
AC代码
#include
using namespace std;
using ll=long long;
int main()
{
ll n;
cin>>n;
ll ans=0;
for(ll a = 1; a*a*a <= n; a++){
for(ll b = a; a*b*b<=n ; b++){
ans += n / (a * b) - b + 1;
}
}
cout<<ans<<endl;
return 0;
}