数据范围BZOJ 3209(花神的数论题-数位统计+1,被数据范围坑了)

PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

    

    

3209: 花神的数论题

    Time Limit: 

    10 Sec  

    Memory Limit: 

    128 MB

    Submit: 

    33  

    Solved: 

    18

    [

    Submit

    ][

    Status

    ][

    Discuss

    ]

    

    

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

    

    

    [

    Submit

    ][

    Status

    ][

    Discuss

    ]

    

    

    好吧……这题一开始的范围是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
数据和范围
---------------------------------

posted @ 2013-05-27 19:35  xinyuyuanm  阅读(178)  评论(0编辑  收藏  举报