The Oculus

题意:给出一个费波纳希数列的某几个表示a,b,c,问ab的乘积原本是c,但c修改了某一位,求修改了哪位。
思路:直接暴力冲,主要是找出一个适合的mod使得它们形成一一映射,但是似乎用unsigned long long可以直接表示。也就是先进行预处理,然后再进行求出a,b,最后直接遍历求解答案即可。
代码:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int maxn=2e6+10;
ull f[maxn];
void inti(){
    f[1]=1,f[2]=2;
    for(int i=3;i<=2e6+7;i++){
        f[i]=f[i-1]+f[i-2];
    }
}
int main(){
    inti();
    int t;
    cin>>t;
    while(t--){
        int n,ch;
        scanf("%d",&n);
        ull a=0,b=0,c=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&ch);
            if(ch) a+=f[i];
        }
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&ch);
            if(ch) b+=f[i];
        }
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&ch);
            if(ch) c+=f[i];
        }
        for(int i=1;i<=2e6+7;i++){
            if(c+f[i]==a*b){
                printf("%d\n",i);
                break;
            }
        }
    }
    return 0;
}

Lead of Wisdom

题意:给出n件物品,一共有k种类型,每件物品有四种属性,问选择出每种类型中一件物品,然后求出使得那个公式值最大的一种方案。
思路:直接爆搜。首先是先将k中类型先分好类来,然后进行爆搜即可。
代码:

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
struct node{
    int a,b,c,d;
};
vector<node> v[100];
int p[100],cnt;
ll ans=0;
void dfs(ll suma,ll sumb,ll sumc,ll sumd,ll index){
    if(index>cnt){
        ll sum=(100LL+suma)*(100LL+sumb)*(100LL+sumc)*(100LL+sumd);
        ans=max(ans,sum);
        return;
    }
    int len=v[index].size();
    for(int i=0;i<len;i++){
        suma+=v[index][i].a;sumb+=v[index][i].b;
        sumc+=v[index][i].c;sumd+=v[index][i].d;
        dfs(suma,sumb,sumc,sumd,index+1);
        suma-=v[index][i].a;sumb-=v[index][i].b;
        sumc-=v[index][i].c;sumd-=v[index][i].d;
    }
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        ans=0;
        cnt=0;
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=1;i<=k;i++)  v[i].clear();
        memset(p,0,sizeof(p));
        for(int i=0;i<n;i++){
            int type,a,b,c,d;
            scanf("%d%d%d%d%d",&type,&a,&b,&c,&d);
            if(!p[type])  v[++cnt].push_back(node{a,b,c,d}),p[type]=cnt;
            else  v[p[type]].push_back(node{a,b,c,d});
        }
        dfs(0,0,0,0,1);
        printf("%lld\n",ans);
    }
    return 0;
}