比赛链接:https://codeforces.com/contest/1110
B:
求最小的修复花费,用k个胶带修补n个漏洞,就是要修补覆盖n-k段区间,求覆盖区间和的最小值即可,对区间排序,取最小的n-k个
(代码略)
C:字丑轻喷QAQ。
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long power(long long a,long long p){ 4 long long ans=1,temp=a; 5 while(p){ 6 if(p&1) ans=ans*temp; 7 temp=temp*temp; 8 p>>=1; 9 } 10 return ans; 11 } 12 long long divisor(long long k) 13 { 14 long long ans=0;int i; 15 for(i=2;i*i<=k;i++) 16 { 17 if(k%i==0) {ans=i;break;} 18 } 19 if (ans==0) return 1; 20 return k/ans; 21 } 22 long long solve(long long k) 23 { 24 for(long long i=2;i<=25;i++) 25 { 26 if(k==power(2,i)-1) return divisor(k); 27 } 28 return power(2,ceil(log2(k+1)))-1; 29 } 30 int main() 31 { 32 long long n; 33 cin>>n; 34 while(n--) 35 { 36 long long t;cin>>t; 37 cout<<(solve(t))<<endl; 38 } 39 return 0; 40 }