2 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; int main(){ //小小数学题啦(感觉比上一题简单阿鲁! /* 思路: b*gcd(a, b)必然为b的倍数,那么a+b也为b的倍数。 可得a为b的倍数,gcd(a, b)为b。 考虑枚举b(i),然后每次ans加上可与当前b匹配的合法a的数量。 定义x为(a+b)/(b*gcd(a, b)),相应的每次枚举有多少个x就有多少个a。 当前b(i)中x最大取值为(n+i)/(i*i)[b*gcd(a, b)], 同时x的数量也为这个最大值,直接累计和即可。 */ int T; scanf("%d", &T); while(T--){ LL n, m; scanf("%lld%lld", &n, &m); LL t=sqrt(n+m), K=min(t, m), ans=0; for(LL i=1; i<=K; i++) ans+=(n+i)/(i*i); printf("%lld\n", ans-1); } return 0; } -
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; int main(){ //小小数学题啦(感觉比上一题简单阿鲁! /* 思路: b*gcd(a, b)必然为b的倍数,那么a+b也为b的倍数。 可得a为b的倍数,gcd(a, b)为b。 考虑枚举b(i),然后每次ans加上可与当前b匹配的合法a的数量。 定义x为(a+b)/(b*gcd(a, b)),相应的每次枚举有多少个x就有多少个a。 当前b(i)中x最大取值为(n[a最大为n]+i)/(i*i)[b*gcd(a, b)], 同时x的数量也为这个最大值,直接累计和即可。 */ int T; scanf("%d", &T); while(T--){ LL n, m; scanf("%lld%lld", &n, &m); LL t=sqrt(n+m), K=min(t, m), ans=0; for(LL i=1; i<=K; i++) ans+=(n+i)/(i*i); printf("%lld\n", ans-1); } return 0; }
- 1
信息
- ID
- 2117
- 时间
- 500ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 28
- 已通过
- 13
- 上传者