NC53452. 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; }