Codeforces Round #553 (Div. 2) 【C. Problem for Nazar】

题目大意:

一开始第一行是 1,第二行是2 4 ,第三行是3 5 7 9 ,类似这样下去,每一行的个数是上一行的个数,然后对这些点从第一个进行编号,问你从[l,r]区间数的和。

思路:分别求出奇数和偶数的个数。然后开始暴力。居然过了==

公式;前m个奇数的和是(m^2),前m个偶数的和是(m*(m+1))。

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 #define int unsigned long long
 5 #define mod 1000000007
 6 int fqow(int a,int b){
 7     int  ans=1;
 8     while(b){
 9         if(b%2){
10             ans*=a;ans%=mod;
11         }
12         b/=2;
13         a*=a;
14         a%=mod;
15     }
16     return ans;
17 }
18 int slove(int n){
19     int sodd=1;int seven=0;
20     int sum=1;int add=1;int cnt=1;//次数 
21     for(;;){
22         if(sum>n){
23             break;
24         }
25         add*=2;
26         cnt++;//次数 
27         if(cnt%2){
28             sodd+=add;
29         }else{
30             seven+=add;
31         }
32         sum+=add;
33     }
34     if(cnt%2){
35         int temp=n-(sum-add);
36         sodd-=add;
37         sodd+=temp;
38     }else{
39         int temp=n-(sum-add);
40         seven-=add;
41         seven+=temp;
42     }
43     
48     
49     int ans1=(sodd%mod)*((sodd)%mod)%mod;
50     int ans2=(seven%mod)*((seven+1)%mod)%mod;
51     return (ans1%mod+ans2%mod)%mod;
52     
53 }
54 signed main(){
55     int L,R;
56     cin>>L>>R;
57 //    cout<<slove(L)<<" "<<slove(R)<<" "<<'\n';
58     cout<<(slove(R)%mod-slove(L-1)%mod+mod)%mod<<'\n';
59     return 0;
60 }
61 
62 /*
63 1 3 5 7 9 25
64 1 3 5 7  16
65 1 3 5  8
66 1 3 4
67 
68 2 4 6
69 odd  1  4  16   64
70 even  2  8   32 
71 2 4 6 12
72 
73 2 4 6 8 20
74 */

猜你喜欢

转载自www.cnblogs.com/pengge666/p/11837669.html