社区讨论
宏定义与函数相关
学术版参与者 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)
答案就会变小。测试传入 ,输出为 。这个不知道为什么。
还有其他有关宏定义的提示都可以发在讨论区,避雷一下防止 CSP 爆 。
回复
共 11 条回复,欢迎继续交流。
正在加载回复...