社区讨论

宏定义与函数相关

学术版参与者 4已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@mhj0hpl2
此快照首次捕获于
2025/11/03 18:43
4 个月前
此快照最后确认于
2025/11/03 20:29
4 个月前
查看原帖
相关题目:https://www.luogu.com.cn/problem/P3583
我在这题的代码:
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll LMT=10416;
ll n,dp[LMT+10],wei;
ll geti2(ll x){ return (x*(x+1ll)/2ll*(2ll*x+1ll)/3ll); }
ll solve(ll n){
    if(n<=LMT)
        return dp[n];
    ll N=pow(n*3,0.333);
    while(geti2(N-1)>=n) --N;
    while(geti2(N)<n)    ++N;
    return N+(solve(geti2(N)-n)>=N);
}
int main(){
    cin>>n;
    for(int i=1;i<=min(n,LMT);i++)
        dp[i]=1e18;
    for(ll i=1;i*i<=min(n,LMT);i++)
        for(ll j=min(n,LMT);j>=i*i;j--)
            if(dp[j-i*i]!=1e18)dp[j]=min(dp[j],i);
    if(n<=LMT&&dp[n]==1e18)
        cout<<"- ";
    else
        cout<<solve(n)<<" ";
    for(int i=1;i<=min(n,LMT);i++)
        wei+=((dp[i]==1e18)||(geti2(dp[i]-1)>i));
    if(n>LMT){
        ll N=pow(n*3,0.333);
        while(geti2(N-1)>=n) --N;
        while(geti2(N)<n)    ++N;
        wei+=31*(N-32);
        for(int i=1;i<=128;i++)
            wei+=((dp[i]==1e18)&&(geti2(N)-i<=n));
    }
    cout<<wei;
    return 0;
}
注意这个第六行,我改成
CPP
#define geti2(x) (x*(x+1ll)/2ll*(2ll*x+1ll)/3ll)
答案就会变小。测试传入 x20x\le 20,输出为 20geti2(x)0-20\le \text{geti2}(x)\le 0。这个不知道为什么。

还有其他有关宏定义的提示都可以发在讨论区,避雷一下防止 CSP 爆 00

回复

11 条回复,欢迎继续交流。

正在加载回复...