CF1166D——数学公式思维题

#include<bits/stdc++.h>
using namespace std;
#define ll long long

ll ans[100],a,b,m;

/* b=2^(n-2)a + 2^(n-3)r2 + 2^(n-4)r3 + ... + rn-1 + rn 
  可以推出这么个公式,然后枚举n(2-50)即可
  从r2开始贪心求最大的r2,然后后面的ri都可以依次确定下来
*/ int solve(ll a,ll b,ll m,ll n){//长度为n是否可行 ans[1]=a; for(int i=0;i<n-2;i++){ a<<=1; if(a>b)return 0; } b-=a; ll p=(ll)1<<(n-2); if(b<p || b>m*p || b/p>m)return 0; b-=p; for(int i=2;i<n;i++){ ll x=b>>(n-i-1); x=min(x,m-1); ans[i]=x+1; b-=x<<(n-i-1); } if(b<0 || b>m-1)return 0; ans[n]=b+1; ll sum=ans[1]; for(int i=2;i<=n;i++) ans[i]+=sum,sum+=ans[i]; cout<<n<<" "; for(int i=1;i<=n;i++) cout<<ans[i]<<" "; puts(""); return 1; } int main(){ int q;cin>>q; while(q--){ memset(ans,0,sizeof ans); cin>>a>>b>>m; if(a==b){ cout<<"1 "<<a<<endl; continue; } int flag=0; for(int i=1;i<=50;i++){ if(solve(a,b,m,i)){ flag=1; break; } } if(!flag)puts("-1"); } }
原文地址:https://www.cnblogs.com/zsben991126/p/10896168.html