题意:就是输出在长度为N的各种01串里面能够找到的1在前面0在后面这种位置的字符,你能在这个很多长度为N的串里面找到多少个。
首先,看到数据1e18肯定是一个规律题,所以我们仔细想一下,我们先把1和0在长度为N的串里面弄出来,有序排列 无序组合,既然题意要求1在前,所以我们不能考虑顺序 只能组合,那么就是C(N,2),然后是不是我们就应该枚举剩下的各种类型的串了,是不是我们先已经选出来了1,0的位置组合好啦,现在就和剩下的N-2的串相互*,然后就是我们的数量啦,N-2的长度 我们每个位置只有0或者1的选择是吧,每个位置就是2种选法那么N-2个位置是不是就是2^(N-2),注意开longlong还有mod.我很无语的是我直接一步出答案但是只有13分,最后我分布去计算就过啦。

#include <bits/stdc++.h>
#define fio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define debug(x) cout << #x << ": " << x << endl;
#define debug1(x) cout<<"xxx"<<endl;
#define ll long long
#define ull unsigned long long
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#define mse(a,b) memset(a,b,sizeof b);
using namespace std;
const int maxx=1e6+100;
const int mod=1e9+7;
ll qpow(ll a,ll b)
{
    ll ans=1;
    while(b>0)
    {
        if(b&1) ans=(a*ans)%mod;
        b>>=1;
        a=(a*a)%mod;
    }
    return ans%mod;
}
int main()
{
    ll a;
    cin>>a;
    ll sum=(a%mod)*((a-1)%mod)/2%mod;
    ll daan=sum*qpow(2,a-2)%mod;
    cout<<daan<<endl;
    return 0;
}