我看到了某道题
  • 板块灌水区
  • 楼主zcx0628
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/6/8 10:08
  • 上次更新2024/6/8 12:35:17
查看原帖
我看到了某道题
779007
zcx0628楼主2024/6/8 10:08

小 Z 有一个长度为 ? n 的数组,但是这个数组发生了一些奇妙的变化——每一秒这个数组都在不断的收缩!

每一秒,数组中相邻的两个数字会合并成一个,产生一个新的数组,一直持续到数组只剩下两个数字。每一次的合并,就是将两个数字相加。

例如有一个长度为 5 5 的数组 [1,2,3,4,5]:

第一秒:会合并 ( 1 , 2 ) , ( 3 , 4 ) (1,2),(3,4),因为没有第六个数字,所以 5 5 不变,即变成新数组 [3,7,5]

第二秒:会合并 ( 3 , 7 ) (3,7),因为没有第四个数字,所以 5 5 不变,即变成新数组 [10,5]

此时,数组收缩到只有两个数字,结束变化。

现在小 Z 想知道,对于任意一个长度为 ? n 的数组,收缩到最后只剩下两个数字时,这两个数字的平方和会是多少?

由于答案可能很大,只需要输出答案对 10^9+7 取模的结果。

n<10^18, k<10^5, y<2147483647

我的代码:

#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
long long n,k;
struct low_range{
    long long n,m;//n是数量,m是值
};
vector<low_range> vec;
int main(){
    cin>>n>>k;
    long long ans1=0,ans2=0,k1=0,k2=0,all_lgth=0,index1=0;//ans1,ans2分别是那两个最终的数
    //k1,k2是前后两个最终的数在原本数组中的数有多少个,all_lgth是总长度,index1是下标
    for(int i=0;i<k;i++){
        int a1,a2;
        cin>>a1>>a2;
        all_lgth+=a1;
        low_range lr;
        lr.m=a1;
        lr.n=a2;
        vec.push_back(lr);
    }
    k1=ceil(all_lgth*1.0/2);
    k2=all_lgth-k1;
    /*cout<<k1<<" "<<k2<<endl;*///调试用,请忽略
    while(k1>=0){
        if(vec[index1].m>k1){
            ans1+=k1*vec[index1].n;
            k1=0;
        }else{
            ans1+=vec[index1].m*vec[index1].n;
            k1-=vec[index1].n;
        }
        index1++;
    }
    index1=0;//归零
    while(k2>=0){
        if(vec[index1].m>k2){
            ans2+=k2*vec[index1].n;
            k2=0;
        }else{
            ans2+=vec[index1].m*vec[index1].n;
            k2-=vec[index1].n;
        }
        index1++;
    }
    cout<</*ans1<<" "<<ans2<<endl<<*/(ans1*ans1%mod+ans2*ans2%mod)%mod;//输出结果,分开算以免爆炸
    return 0;
}

请好心のdalao们帮我改一下代码好吗……

2024/6/8 10:08
加载中...