-1
nが与えられていれば、ちょうど2ビットで形成できるn番目の番号を見つける必要があります。2セットのビットを使用して形成されたn番目の番号を見つけよう
良く明確にするために、シーケンスは、基本的には3,5,6,9,10のようになります。..
すなわち。
以下は、私が得た答えに基づいて行ったことです(それでも私には間違った答えが与えられます) )いくつかの隠されたテストケースのため
using namespace std;
#define MAX 10000
#define MOD 1000000007
long long int m[MAX+1];
long long int sum;
long long int binary_search(long long int n)
{
long long int low=0,high=MAX,mid;
while(low<high)
{
mid=low+(high-low+1)/2;
if(m[mid]<=n)
low=mid;
else
high=mid-1;
}
return low;
}
int main()
{
m[0]=1;
for(long long int i=1;i<=MAX;i++)
m[i]=m[i-1]+i;
long long int n,k,l;
int t;
scanf("%d",&t);
for(int test=0;test<t;test++)
{
scanf("%lld",&n);
k=binary_search(n);
//cout<<m[k]<<" ";
l=n-m[k];
cout<<((1<<k+1)%MOD+(1<<l)%MOD)%MOD<<"\n";
}
return 0;
}
制約は1 < = T < = 10^6、1 < = N = 10^14 <あります。
の指標を得るために、NからKまでAPの和を減算し、演算の進行
の和を利用何が問題なのですか? – Codor
ユーザーの入力に応じてどの番号を使用しているかを示すアルゴリズムを作成しますか? –
バイナリ表現に関する質問に対して小数点以下を書いてはいけません... 11,101,110,1001,1010,1100などと書くと問題はかなり簡単になります(k桁の数字がいくつあるかを数えます)。また、32ビット以上の数値を表すには、(符号なしの)long longを使用します。 –