1 条题解

  • 0
    @ 2025-12-9 9:23:03
    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int mod = 1e9 + 7;
    //j为2^j<n 的最大的j 左段为前2^j个数的累加,右段是剩下的n-2^j个数的累加
    //注意模运算的各种细节 
    int main()
    {
    	ll n, k;
    	cin >> n >> k;
    	ll ans = 1;//ans为左半部分的长度 
    	while (ans < n){
    		ans *= 2;
    	}
    	ans /= 2;
    	ll l = 0, r = 0, num = 0, a, b;
    	//l为左段的和,r为右段的和,num为左段已经累加了多少数了
    	for (int i = 1; i <= k; i++)
    	{
    		cin >> a >> b;
    		if (num == ans)//属于右边 
    		{
    			r = (r + a % mod * b) % mod;
    		}
    		else if (num + a <= ans)//属于左边 
    		{
    			l = (l + a % mod * b) % mod;
    			num += a;//左边已经有 
    		}
    		else//两边都有 
    		{
    			ll now = ans - num;//左右分界点 
    			l = (l + now % mod * b) % mod;//左边 
    			num += now; //左边已经计算的数 
    			r = (r + (a % mod - now + mod) % mod * b) % mod;//右边 
    		}
    	}
    	cout << (l * l % mod + r * r) % mod << endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    11
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    89
    已通过
    8
    上传者