2 条题解
-
0
当我不想做数学题时:
#include<bits/stdc++.h> using namespace std; #define int long long const int N=2e5+10,P=1e9+7; int dp[N],n; string s; int dfs(int x,int lim) { if(x==0)return dp[x]=1; if(!lim&&dp[x])return dp[x]; int up=lim?s[n-x]-'0':1,ans=0; for(int i=0;i<=up;i++) { if(i==0)ans=(ans+dfs(x-1,lim&&i==up))%P; else ans=(ans+dfs(x-1,lim&&i==up)*2)%P; } if(!lim)dp[x]=ans; return ans; } signed main() { cin>>s;n=s.size(); cout<<dfs(n,1)<<'\n'; return 0; } -
0
题意
以二进制形式给出一个整数 ,问有多少个非负整数对 满足:。答案对 取模。
题解
首先,因为异或相比加法只能让两个一变成零,而不能产生新的一,所以不可以产生进位。
另 表示 二进制前 个刚好是 的前 位的方案数, 是严格小于 的方案数。
若 当前位为 , 那么恰好等于 时, 可以分别填 或 , 所以 。当前位为 时 。
考虑不严格小于的情况,若前面已经严格小于了,那么这一位可以随便填,不进位就行,有 当前位为 的三种情况,, 还有一种情况是前面都相等,刚刚从这一位开始不相等,仅在 当前位是 时有这种情况,只能填 , 所以此时
代码
代码很短,只有 行。
#include <cstdio> long long f0 = 0, f1 = 1, p = 1000000007, s; signed main() { while(scanf("%c", &s) != EOF && (s == '0' || s == '1')) { f0 = f0 * 3 % p; if(s == '1') f0 = (f0 + f1) % p, f1 = f1 * 2 % p; } printf("%lld", (f0+f1) % p); }我不会告诉你把 s 定义成 long long 仅仅是为了美观的。
- 1
信息
- ID
- 11669
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 88
- 已通过
- 5
- 上传者