专栏文章
AT_joisc2007_factor 階乗 (Factorial) 题解
AT_joisc2007_factor题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mino2ryu
- 此快照首次捕获于
- 2025/12/02 05:34 3 个月前
- 此快照最后确认于
- 2025/12/02 05:34 3 个月前
观察数据范围可以发现 。若使用朴素的暴力,最坏时间复杂度可以到达 (即 为质数),说明朴素的暴力难以通过此题。
不难发现,若从 开始枚举 ,若 ,则 。若在操作前发现 ,则说明从 乘到 是 的倍数,答案即为 。
这是题解区域里面前面大佬们的做法,但不难发现如果 是一个较为大的质数如 时间复杂度任较大。所以需要在每次修改后(以及开始之前)查询是否为质数,若为质数且比当前 大,则答案即为该质数。
代码如下:
CPP#include<bits/stdc++.h>
using namespace std;
bool isprime(int x){
for(int i=2;i*i<=x;i++)
if(x%i==0)return false;
return true;
}
int main(){
int n,m;
scanf("%d",&n);m=n;
if(isprime(n)){
printf("%d\n",n);
return 0;
}
for(int i=1;i<=m;i++){//从1开始枚举,至多到n(显然到不了)
if(i%n==0){
printf("%d\n",i);
return 0;
}
if(__gcd(n,i)!=1){
n/=__gcd(n,i);
if(isprime(n) && n>i){//如果是质数且质数>i则输出该质数
printf("%d\n",n);
return 0;
}
}
}
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...