数据范围BZOJ 3209(花神的数论题-数位统计+1,被数据范围坑了)
PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!
3209: 花神的数论题
Time Limit:
10 Sec
Memory Limit:
128 MB
Submit:
33
Solved:
18
[
][
][
]
Description
背景
尽人皆知,花神多年来凭借无边的神力狂虐各大 OJ、OI、CF、TC …… 当然也包含 CH 啦。
描述
话说花神这天又来讲课了。课后按例有超级难的神题啦…… 我等蒟蒻又遭殃了。
花神的标题是这样的
设 sum(i) 表现 i 的二进制表现中 1 的个数。给出一个正整数 N ,花神要问你
派(Sum(i)),也就是 sum(1)—sum(N) 的乘积。
Input
一个正整数 N。
Output
一个数,答案模 10000007 的值。
Sample Input
3
Sample Output
2
HINT
对于样例一,1*1*2=2;
数据范围与约定
对于 100% 的数据,N≤10^15
Source
[
][
][
]
好吧……这题一开始的范围是N<=1015
然后我很天真的认为这不水吗^?结果……
好吧……
之后要来数据以后才发明……
n<=10^15
只有我这类蒟蒻会被这个骗……
被各种D……
Ok,那么这题就是数位统计了……
刚学的……(还在学这个<-弱)
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<functional> #include<cmath> #include<cctype> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define ForD(i,n) for(int i=n;i;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define RepD(i,n) for(int i=n;i>=0;i--) #define MAXN (100000) #define MAXL (50+10) #define F (10000007) int a[MAXN],len=0; long long C[MAXL][MAXL]; long long n; long long calc(int k) { long long ans=0; ForD(i,len) { if (a[i]) { ans+=C[i-1][k]; k--; } if (k<0) return ans; } return ans; } long long pow2(long long a,long long b) { if (b==0) return 1; if (b==1) return a; long long tmp=pow2(a,b/2); tmp=tmp*tmp%F; if (b%2) tmp=(tmp*a)%F; return tmp; } int main() { // freopen("flower1.in","r",stdin); // freopen(".out","w",stdout); Rep(i,50) { C[i][0]=1; For(j,i) C[i][j]=(C[i-1][j]+C[i-1][j-1]); } /* cout<<pow2(2,1001)<<endl; int pp=1; For(i,1001) pp=(pp*2)%F;cout<<pp; */ while (cin>>n) { n++;//cout<<n<<endl; len=0; while (n) {a[++len]=n%2;n/=2;} long long ans=1;//cout<<len<<endl; For(i,len) ans=(ans*pow2(i,calc(i)))%F; printf("%lld\n",ans); }; return 0; }
文章结束给大家分享下程序员的一些笑话语录:
联想——对内高价,补贴对外倾销的伟大“民族”企业。
---------------------------------
原创文章 By
数据和范围
---------------------------------