You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSES硬币组合1代码超时原因咨询:修改const int MOD后解决

为什么修改MOD为const能解决Coin Combinations 1的TLE问题?

核心原因是编译器对const变量和普通变量的优化程度完全不同:

  • 当你用int MOD=1e9+7时,MOD是一个普通全局变量,每次执行dp[i]%=MOD时,CPU都要从内存中读取MOD的值。而这道题的循环次数极多(比如x可达到1e6,内层循环遍历n个硬币,总操作数轻松破1e8),频繁的内存访问会累积出可观的时间开销,直接导致程序超时。
  • 改成const int MOD=1e9+7后,编译器会将MOD识别为编译时常量,直接把1e9+7这个数值硬编码到取模指令里,不需要每次去内存取值,彻底消除了这部分内存访问的开销,程序运行速度大幅提升,刚好满足时间限制。

另外提两个小细节帮你进一步优化代码:

  • 你用的int nums[n]和int dp[x+1]是C风格变长数组(VLA),部分编译器对VLA的内存分配和访问优化较差,换成vector<int> nums(n)和vector<int> dp(x+1, 0)会更稳定,也能避免栈溢出风险(当x很大时,栈上的dp数组可能超出栈空间)。
  • 输入输出可以加ios_base::sync_with_stdio(false); cin.tie(NULL);来关闭同步,进一步加快输入速度。

你的原代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
int MOD=1e9+7;
signed main()
{
    
    int n,x;
    cin>>n>>x;
    int nums[n];
    for(int i=0;i<n;i++){
        cin>>nums[i];
    }
    int dp[x+1]={0};
    dp[0]=1;
    for(int i=1;i<=x;i++){
        for(int q:nums){
            if(i-q>=0){
                dp[i]+=dp[i-q];
                dp[i]%=MOD;
            }
        }
    }
    cout<<dp[x]<<endl; 
}

内容的提问来源于stack exchange,提问作者Aryan phad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:49:54