
最理想的是
1 =1
1+2=3
1+2+3=6
1+2+3+4=10
1+2+3+4+5=15
那么要凑10 直接就是4了
那如果凑11 12呢
我们可以15-1-1-1-1 当然不是最优解
我们只需要-4即可
我们可以
1+2-1+4+5=11 凑-4
那么凑-3呢只需要 1-1+3+4+5=12
但是要凑-1呢
我们只能才最后的位置-1即可
我们要求n*(n+1)/2==x的 n 可以拿二分来找
int main(){
int t;
cin>>t;
while (t--) {
int x;
cin >> x;
ll l = 0;
ll r = 1e8;
while(l < r){
ll mid = l + r >> 1;
if (mid * (mid + 1) / 2 >= x) r = mid;
//check()判断mid是否满足性质
else l = mid + 1;
}
ll z = l * (l + 1) / 2 - x;
if(z == 1)
l++;
cout << l << endl;
}
}
简单的序列:
原代码 (错误的)
int main(){
int t;
int k=e_cheak(MAX);
cin>>t;
while (t--) {
ll s;
cin>>s;
ll ss=s;
vectorv;
v.clear();
if(!vis[s]) cout<<1<=1;i--){
cout<
正确(哥德巴赫猜想)
const int N=1e7+10;
const long long mx=1e7;
int T,p[N],cnt,n,ans1[N],ans2[N];
bool vis[N];
inline void check(int x){
for(int i=1;i<=cnt;i++)
if(!vis[x-p[i]]){
printf("%d + %d ",p[i],x-p[i]);
return;
}
}
int main(){
for(ll i=2;i<=mx;i++){
if(!vis[i]){
for(ll j=i*i;j<=mx;j+=i)vis[j]=1;
p[++cnt]=i;
}
}
cin>>T;
while(T--){
cin>>n;
if(n==0||n==1||!vis[n]){
printf("1n%d = %dn",n,n);
continue;
}
if(n%2==0)printf("2n"),check(n),printf("= %dn",n);
else{
if(!vis[n-2])printf("2n%d + %d = %dn",2,n-2,n);
else printf("3n"),check(n-1),printf("+ 1 = %dn",n);
}
}
}
奇奇怪怪的魔法阵
直接拿状压dp来枚举情况即可
const int N=26;
int dp[1<>n;
int m;
cin>>m;
for(int i=0;i>a>>b;
t[a]|=(1<=0;i--){
res=(res*1ll*233+dp[i])%mod;
}
cout<
其他的没做 有时间补题吧!!!
弱鸡!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)