思路:转换一下等式就是 x = n / (1+2+4+…+2k−1),题目要求x是整数。那也就是说,n是整除于那一大坨的。并且题目保证有解。那么就暴力枚举k就好了嘛,找到一个使得n整除于他们的和的就行了。
AC代码:
#include<bits/stdc++.h>#define int long long#define mk make_pairusingnamespace std;constint N =3e5+11;constint mod =1e9+7;int t,n,m,k;int a[N];signedmain(){int t;
cin>>t;while(t--){
cin>>n;int tmp =3;int now =4;while(n%tmp !=0){
tmp += now;
now *=2;}
cout<<n/tmp<<endl;}return0;}
#include<bits/stdc++.h>#define int long long#define mk make_pairusingnamespace std;constint N =3e5+11;constint mod =1e9+7;int t,n,m,k;int a[N];signedmain(){int t;
cin>>t;while(t--){
cin>>n;if(n%4!=0){
cout<<"NO"<<endl;}else{for(int i =0; i < n/2; i ++)
a[i]= i*2+2;for(int i = n/2; i < n ; i ++)
a[i]=(i-n/2)*2+1;
a[n-1]+= n/2;
cout<<"YES"<<endl;for(int i =0; i < n ; i ++){
cout<<a[i]<<" ";}
cout<<endl;}}return0;}
#include<bits/stdc++.h>#define int long long#define mk make_pairusingnamespace std;constint N =3e5+11;constint mod =1e9+7;int t,n,m,k;int a[N];signedmain(){int t;
cin>>t;while(t--){
cin>>n;for(int i =0; i < n ; i ++) cin>>a[i];int pos =1;
a[0]= a[0];for(int i =1; i < n ; i ++){if(a[i]*a[pos-1]>0){
a[pos-1]=max(a[pos-1],a[i]);}else{
a[pos++]= a[i];}}int sum =0;for(int i =0; i < pos ; i ++) sum += a[i];
cout<<sum<<endl;}return0;}
#include<iostream>#include<bits/stdc++.h>#define int long long#define mk make_pair#define gcd __gcd#define pb push_backusingnamespace std;constdouble eps =1e-10;constint mod =1e9+7;constint N =1e6+7;int n,m,k,t =1,cas =1;//int a[N],b[N];struct node{int from,to,dis;node(int a,int b,int c):from(a),to(b),dis(c){}};
vector<node> que;int dis1[N];int dis2[N];int cost[N];int onpath[N];bool mark[N];
vector<int> edge[N];voidbfs(int s,int t,int dis[]){for(int i =0; i <= n ; i ++) mark[i]=0;
mark[s]=1;int pos =0;
que.pb(node(-1,s,0));while(pos < que.size()){
node now = que[pos++];
dis[now.to]= now.dis;for(int i =0; i < edge[now.to].size();i ++){int to = edge[now.to][i];if(!mark[to]){
mark[to]=1;
que.pb(node(pos-1,to,now.dis+1));}}}
que.clear();}intsolve(int a,int b,int c){for(int i =1; i <= n ; i ++)
onpath[i]=0;bfs(a,b,dis1);int dis_ab = dis1[b];bfs(b,a,dis2);for(int i =1; i <= n ; i ++)if(dis1[i]+dis2[i]== dis_ab)
onpath[i]=1;bfs(c,b,dis2);int res = cost[dis_ab];int minn =1e18;for(int i =1; i <= n; i ++){if(!onpath[i])continue;if(dis1[i]> dis_ab)continue;if(dis2[i]+dis_ab > m)continue;int new_cost = cost[dis_ab-dis1[i]]+(cost[dis2[i]+dis_ab]-cost[dis_ab]);//cout<<i<<" "<< dis1[i]<<" "<<dis2[i]<<" "<<(cost[dis2[i]+dis_ab]-cost[dis_ab])<<" "<<new_cost<<endl;
minn =min(minn,new_cost);}return res+minn;}signedmain(){
cin>>t;while(t--){int a,b,c;
cin>>n>>m>>a>>b>>c;for(int i =1; i <= n ; i ++)
edge[i].clear();for(int i =1; i <= m ; i ++) cin>>cost[i];sort(cost+1,cost+m+1);for(int i =2; i <= m ; i ++)
cost[i]+= cost[i-1];for(int i =0; i < m ; i ++){int x,y;
cin>>x>>y;
edge[x].pb(y);
edge[y].pb(x);}
cout<<min(solve(a,b,c),solve(c,b,a))<<endl;}}/**
**/