NC21791. 逃离幻想乡
描述
输入描述
一行2个数字n,。
输出描述
第一行一个数表示ans1,第二行一个数表示ans2。
示例1
输入:
10 3
输出:
1 3
C++11(clang++ 3.9) 解法, 执行用时: 20ms, 内存消耗: 468K, 提交时间: 2019-06-02 20:18:21
#include<bits/stdc++.h> #define MOD 1000000007 typedef long long LL; using namespace std; int n,L; LL fpower(int a,int b,int p){ LL ans=1; for( ;b;b>>=1) if(b&1) ans =(LL)ans*a%MOD,a=(LL)a*a%MOD; else a=(LL)a*a%MOD;return ans;} LL ans1=0,ans2=0; int main() { cin>>n>>L; LL x=1,x1; for(int i = 0 ; i <= n ; i ++) { x1 = x; while(x1>=10) x1/=10; if(x1==L) ans1++; if(x>=LLONG_MAX/2) x/=10; x*=2; } cout<<ans1<<endl<<(fpower(2,ans1+2,MOD)-5+MOD)%MOD; return 0; }
C++14(g++5.4) 解法, 执行用时: 24ms, 内存消耗: 492K, 提交时间: 2020-02-05 21:57:49
#include<stdio.h> int n,l,i,ans1,ans2; long long t=1,P=1000000007; int hd(long long x){for(;x>9;x/=10);return x;} long long pw(int x,int y){if(y==0)return 1;long long t=pw(x,y>>1);t=t*t%P;return y&1?t*x%P:t;} int main(){ scanf("%d%d",&n,&l); for(i=0,ans1=l==1;i<n;++i){t*=2;if(t>=1e18)t/=10;if(hd(t)==l)++ans1;} ans2=((pw(2,ans1)-1)*4-1+P)%P; printf("%d\n%d",ans1,ans2); }