1.召唤数学精灵 - 蓝桥云课
问题描述
数学家们发现了两种用于召唤强大的数学精灵的仪式,这两种仪式分别被称为累加法仪式 A(n) 和累乘法仪式 B(n)。
累加法仪式 A(n) 是将从1到 n 的所有数字进行累加求和,即:
A(n)=1+2+⋯+n
累乘法仪式 B(n) 则是从1到 n 的所有数字进行累乘求积,即:
B(n)=1×2×⋯×n
据说,当某个数字 i 满足 A(i)−B(i) 能被100整除时,数学精灵就会被召唤出来。
现在,请你寻找在1到2024041331404202之间有多少个数字 i,能够成功召唤出强大的数学精灵。
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
思路:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e4;
ll n = 2023041331404202;
ll ad[N],chen[N],ans = 0;
int main(void)
{
ll a = 0,b = 1;
for(ll i = 1 ; i <= 1000 ; i++)
{
a =(a+i)%100;
b =(b*i)%100;
ll t = (b - a) % 100;
if(t % 100 == 0) cout<<i<<endl;
}
return 0;
}
我们可以发现,从200以后开始,每200个数字都会出现4次。1~200的数字出现6次,不满足周期。所以我们要减去前200的数字。注意,这里是划分数字,减去200不是缩小范围
-
为何减去200?:这是将总范围分割为前200和后续部分,确保前200个被单独处理,而后续部分应用周期性规律。减法仅用于计算剩余数字的数量,不会减少实际范围。
-
是否遗漏前200的解?:不会,前200的解已单独计算并加到总结果中。后续的周期性计算仅针对201到N的部分。
所以答案就是(2024041331404202 / 200)*4 + 6
代码:
#include <iostream>
using namespace std;
int main()
{
cout << ll(2024041331404202 / 200)*4 + 6;
return 0;
}