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 */