列表

详情


NC53452. Forsaken的位运算魔法

描述

        Forsaken是一个膜法师,特别擅长位运算魔法。经常会有挑战者来挑战他,但是Forsaken的精力有限,所以只有解决Forsaken预先设计的问题,Forsaken才会接受挑战者的挑战。
        今天Forsaken的问题是给出一个和一个,计算表示异或位运算符号)。由于答案可能比较大,挑战者只需要给出在模意义下的结果就行了。

输入描述

一行一个和一个

输出描述

一个整数表示在模意义下的答案。

示例1

输入:

1 1

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4426ms, 内存消耗: 504K, 提交时间: 2019-10-26 10:08:05

#include<bits/stdc++.h>
#define int long long
using namespace std;const int mod=1e9+7;
int ans,n,m,i,j;
int f(int a,int b,int c,int n){
    if(!a)return (n+1)*(b/c);
    if(a>=c||b>=c)return (f(a%c,b%c,c,n)+n*(n+1)/2*(a/c)+(n+1)*(b/c));
    int M=(a*n+b)/c;
    return (n*M-f(c,c-b-1,a,M-1));
}
int32_t main(){
    for(cin>>n>>m,i=0;i<=n;++i)for(j=0;j<=50;++j)if(m>>j&1){
        ans+=(n+1-(f(i,0,1LL<<j,n)-2*f(i,0,1LL<<j+1,n)))%mod*((1LL<<j)%mod)%mod;
    }else{
        ans+=(f(i,0,1LL<<j,n)-2*f(i,0,1LL<<j+1,n))%mod*((1LL<<j)%mod)%mod;
    }cout<<(ans%mod)<<endl;
}

C++11(clang++ 3.9) 解法, 执行用时: 3267ms, 内存消耗: 496K, 提交时间: 2020-07-27 18:13:37

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

const int mod=1e9+7;
int main()
{
    long long i,j,k,n;
	__int128 ans=0;
	scanf("%lld%lld",&n,&k);
	for(i=0;i<=n;i++)
	    for(j=i+1;j<=n;j++)ans+=i*j^k;
	ans<<=1;
	for(i=0;i<=n;i++)ans+=i*i^k;
	printf("%d\n",(int)(ans%mod));
    return 0;
}

上一题