小 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们帮我改一下代码好吗……