1、若n在1~k内,则计算a[1]到a[n]的和
2、若n>k,则判断有多少个f[k+1]到f[2*k]这样的循环
3、注意取模
大致的思路就是这样(注意取模)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mo 1000000007
int a[100];
int f[100];
int main()
{
int t;
scanf("%d",&t);
while(t--){
ll k,n;
ll ans1=0,ans2=0;
scanf("%lld%lld",&k,&n);
for(int i=1;i<=k;i++){scanf("%d",&a[i]);ans2+=a[i];}
for(int i=1;i<=k;i++){scanf("%d",&f[i]);ans1+=f[i];}
if(n<k){
ll sum=0;
for(int i=1;i<=n;i++)sum+=a[i];
cout<<sum%mo<<endl;
}else{
ll y,z;
z=(n-k)/k; //多少个循环体
y=(n-k)%k; //余数
ll sum1=0;
for(int i=1;i<=y;i++){
sum1+=f[i];
}
ll sum=(sum1%mo+(z%mo)*(ans1%mo)%mo+ans2%mo)%mo;
cout<<sum<<endl;
}
}
return 0;
}