2019ACM-ICPC沈阳网络赛-K-Guanguan's Happy water(思维+暴力)

(题面还不能看,晚点加上题面)

思路:

suma=(a1+a2+。。。+ak)

sumf=(f1+f2+。。。+f3)

①n<=k,ans=a1+a2+。。。+an;

②n<=2k,ans=suma+f1+f2+。。。+f(n-k);

③n>2k,ans=suma+((n-k)/k)*sumf+(   f1+f2+。。。+f( (n-k)%k )  ).

注意取模就行

AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=1e6+7;
 5 ll mod=1e9+7;
 6 ll a[maxn],f[maxn];
 7 int main()
 8 {
 9     int t;
10     scanf("%d",&t);
11     while(t--){
12         int k;
13         ll n,suma=0,sumf=0,k2;
14         scanf("%d",&k);
15         k2=ll(k);
16         scanf("%lld",&n);
17         for(int i=1;i<=k;++i)
18             scanf("%lld",&a[i]),suma=(suma+a[i])%mod;
19         for(int i=1;i<=k;++i)
20             scanf("%lld",&f[i]),sumf=(sumf+f[i])%mod;
21         ll ans=0;
22         if(k2>=n){
23             for(int i=1;i<=int(n);++i)
24                 ans=(ans+a[i])%mod;
25             printf("%lld\n",ans%mod);
26         }
27         else{
28             ans=suma%mod;
29             ll nu=((n-k2)/k2);
30             int len=n-nu*k2-k2;
31             nu%=mod;
32             ans=(nu*sumf+ans)%mod;
33             for(int i=1;i<=len;++i)
34                 ans=(ans+f[i])%mod;
35             printf("%lld\n",ans%mod);
36         }
37     }
38     return 0;
39 }
40 /*
41 2
42 2 100000000000000000
43 6 5 5 5
44 */

猜你喜欢

转载自www.cnblogs.com/CharlieWade/p/11519645.html