今天我发现了许多的玄学过法,请大家帮我解释一下。
第一个:
题目描述
时间:1s 空间:256M
题目描述:
输入正整数 N,M,输出 N,M 之间的所有 质数。
输入格式:
输入一行,包含两个正整数 N,M
输出格式:
输出一行,以空格隔开。
样例输入:
23 40
样例输出:
23 29 31 37
约定:N \le M<2^{31},M−N \le20000
这道题,我们直接使用判断质数:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[100005];
bool is_prime(int x){
不告诉你
}
signed main(){
int a,b,s;
cin>>a>>b;
for(int i=a;i<=b;i++){
if(is_prime(i)==true){
cout<<i<<" ";
}
}
}
是可以过的。
但是把 #define int long long 去掉,就会变成 TLE 80分。
接下来,我们继续看:
题目描述
对N!进行质因子分解。
输入输出格式
输入格式:
输入数据仅有一行包含一个正整数N,N<=10000。
输出格式:
输出数据包含若干行,每行两个正整数p,a,中间用一个空格隔开。表示N!包含a个质因子p,要求按p的值从小到大输出。
输入输出样例
输入样例#1:
10
输出样例#1:
2 8
3 4
5 2
7 1
说明
10!=3628800=(2^8)(3^4)(5^2)*7
这道题,我们来看看我的解法:
#include <bits/stdc++.h>
#define int long long
using namespace std;
bool is_prime(int x){
不告诉你
}
int a[100005];
bool p[100005];
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
if(is_prime(i)==true){
a[i]++;
p[i]=true;
}
}
for(int i=2;i<=n;i++){
if(p[i]==true){
continue;
}
int s=i;
for(int j=2;j<=i;j++){
if(p[j]==false) continue;
while(s%j==0){
不告诉你
}
if(s==1) break;
}
cout<<endl;
}
for(int i=1;i<=n;i++){
不告诉你
}
}
这也是满分。但是依旧把#define int long long去掉,变成 TLE 90分。