文章

6

粉丝

375

获赞

3

访问

46.6k

头像
折半+状态压缩
P1625 上海交通大学2017年机试题
发布于2021年3月21日 20:12
阅读数 8.8k

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

int f[39]; //第39项Fibonacci数为102334155(>1e8)
map<int,int> cnt1, cnt2;

int main() {
    f[0]=f[1]=1;
    for(int i=2; i<40; ++i) f[i]=f[i-2]+f[i-1];
    for(int s=0; s<1<<19; ++s) { //用s枚举前19项的所有可能状态
        int sum=0;
        for(int i=0; i<19; ++i) if(s>>i&1) { //s的第i位为1,表示选择第i+1项
            sum+=f[i+1];
        }
        cnt1[sum]++;
    }
    for(int s=0; s<1<<19; ++s) { //用s枚举后19项的所有可能状态
        int sum=0;
        for(int i=0; i<19; ++i) if(s>>i&1) { //s的第i位为1,表示选择第i+20项
            sum+=f[i+20];
        }
        cnt2[sum]++;
    }
    int n; 
	while(cin>>n){
    int answer=0;
    for(pair<int,int> p: cnt1) { //从小到大枚举cnt1的所有键对
        if(p.first>n) break; //map是排好序的,这里都不行了,后面就更不行了
        answer+=p.second*cnt2[n-p.first]; //n-p.first为互补的值
    }
    cout<<answer<<endl;
	}
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发