【数论】玄学过关

今天我发现了许多的玄学过法,请大家帮我解释一下。

第一个:
题目描述
时间: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分。

所以,谁能用科学的方法解释这个玄学过关?

由于这题可能跟操作系统有关,即int的操作速度可能是比long long慢的,同样的,可以看到NOI2025大佬的游记中写到这篇,unsigned long long是比long long快的!

好的,所以 @CZF2919 能否使用更加具体的话说呢?

反正你記住,我建議你隨時打開 long long

假如是同一个运算,你把变量定义成 long long 型的,运算速度肯定要快,因为定义的变量占得空间多,空间大运算起来就很方便。就好比你的计算机,当你开了很多软件,只留下很少的内存,然后你再开一个很大的游戏,你就会发现玩游戏很卡,内存少了速度就慢了。而你什么都不开,只开游戏就不会卡,空间大,运行速度就快了。

@Erin 觀帖吧

不過有時候 int 是比 long long 快的

1 个赞

这算AC代码吗?

不算。