Python and C++的题解
2025-10-03 12:59:24
发布于:广东
问个问题:为什么一道入门通过率这么低?
我的猜想:你们是不是知道13!会爆int,所以一看到要算10000!就想开高精?
开高精也行,但完全没必要,搞不好还会看到好几只红色的WA并听取WA声一片,可以用下面的东西化解。
模运算的性质(在这题里面很重要,能避免开高精):
{"mod"就是数学中的取模运算,把它看成'%'就行}
1、(a mod m) mod m = a mod m
2、(a + b) mod m = [(a mod m) + (b mod m)] mod m
3、(a - b) mod m = [(a mod m) - (b mod m)] mod m
4、(a × b) mod m = [(a mod m) × (b mod m)] mod m
这里仅需第4条
看到这里,是不是有思路了?
边乘边取模!!!!!!!!!!!!
递归解释:
定义:自己去找
阶乘递归:
int factorial(int n)
{
if(n==0) return 1;//0!=1!=1;这里n==1 or n==0皆无妨,无非就是多或少一层递归的事
/*What?你问我证明0!=1?
因为1!=1*(1-1)!=1*0!=1;
所以0!=1.
oi,这是编程不是数学(虽然编程总是扯上数学)
*/
else
return n*factorial(n-1);
/*
这是纯阶乘,无取模,至于取模在返回值后面加个%998244353就行
思路:(以下将factorial(n)简称为f(n))
例:当n==3
判断n==0?结果为假
返回3*f(3-1)%998244353 f(3-1)==2;计算后f(3)返回6,即f(3)最终返回6,结束递归。
再判断n==0?结果为假
f(3-1)返回一个2*f(2-1)%998244353 f(2-1)==1;计算后f(3-1)返回2
判断,假结果
f(2-1) 返回 1*f(1-1)%998244353 f(1-1)==1;代入原式计算后f(2-1)返回1
判断,真结果
f(1-1)返回1。 (开始向上回代)
//Python的思路类似于此
*/
}
解释完毕,上代码
三个cpp
//递归(正常版)
#include<cstdio>
using namespace std;
typedef unsigned long long llu;//定义名字:将unsigned long long 命名为llu
//其实定义名字这一步完全多余,只是我当时忘记int存不存得下998244353,怕死就开了无符号long long
const long long MOD=998244353;//定义常量(也是多余,直接对998244353取模即可)
llu factorial(llu p)//等价于unsigned long long factorial(unsigned long long p)
{
if(p==0) return 1;
else
return (p*factorial(p-1))%MOD;
}
int main()
{
int n;
scanf("%d",&n);//cin>>n;
printf("%llu",factorial(n));//cout<<factorial(n);这里注意函数返回值类型是unsigned long long 而不是int
return 0;
}
//循环(没什么好说的)
#include<cstdio>
using namespace std;
const int MOD=998244353;
int main()
{
int n,rezult=1;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
rezult*=i;
rezult%=MOD;
}
printf("%d",rezult);
}
//递归(莫名其妙被优化版)
#include<cstdio>
using namespace std;
typedef unsigned long long llu;
const int MOD=998244353;
llu factorial(llu p)
{
if(p==0) return 1;
else
return p*factorial(p-1)%MOD;
}
int main()
{
int n;
scanf("%d",&n);
printf("%llu\n",factorial(n));
return 0;
}
//我也不知道怎么搞的,对比上面那个递归,这段代码我提交后用时0ms、内存1.60MB
//虽然不知道原理,但还是放这里给你们用吧(我自己提交是这样,不知道你们是不是)
//我又想到如果把无符号longlong换成int,并且不定义常量,这样会不会使占用内存更小?那就让你们替我试试毒吧"v"
两个py
#循环
a=int(input())
rezult =1
MOD = 998244353
i=1
while i<=n:
rezult *=i
rezult %=MOD
print(rezult)
#递归
MOD = 998244353
def factorial(n):
if n == 0:
return 1
else:
return (n*factorial(n-1))%MOD
a=int(input())
print(factorial(a))
结尾的废话:
思路明确后代码就简单了。(这个不是废话"v")
还有,为什么编辑题解的时候没有自动对齐,还要我一个一个地去打空格?
致敬自己编程生涯第一篇题解"v"
有什么问题发评论区,我看到就会回复
点个赞再走吧"v"(这个也不是废话"v")
全部评论 2
对比Python和C的数据,Python的耗时内存都比C高
Python怎么这么慢?蟒蛇爬行速度有这么慢?2025-10-03 来自 广东
0ber,为什么循环那里是错的?
我抓紧修改:
#include<cstdio>
using namespace std;
typedef long long ll;
const ll MOD=998244353;
int main()
{
ll n,rezult=1;
scanf("%lld",&n);
for(ll i=1;i<=n;++i)
{
rezult*=i;
rezult%=MOD;
}
printf("%lld",rezult);
}
这段代码首次提交是AC,时间0ms,内存1.57MB,击败100.00%的用户
我是真不懂,这又是什么逆天数值?2025-10-03 来自 广东
0






有帮助,赞一个