递归规范写法(P1762 偶数)
打表(杨辉三角一般都是规律题)
#include<bits/stdc++.h>
using namespace std;
int n;
int f[102][102];
int main(){
f[0][0]=1;
for(int i=1;i<=50;++i){
//cout << i << ": ";
printf("%3d: ",i);
for(int j=1;j<=i;++j){
f[i][j]=f[i-1][j]+f[i-1][j-1];
if(f[i][j]%2) cout << "*";
else cout << '.';
}
cout << "\n";
}
return 0;
}
==> f(2k + t)= 3k + 2* f ( t )
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int const mod=1000003;
ll ksm(ll a,ll b){
ll res=1;
while(b){
if(b&1) (res*=a)%=mod;
b >>= 1;
a*=a;
a%=mod;
}
return res;
}
int v[57];
ll v2[57],ans,sum;
int f(ll& n){
if(n==1) return 1;
ll k=log(n)/log(2);
n-=v2[k];
ll res=0;
res+=v[k];
if(n) res+=2*f(n); //if优秀的剪枝
if(res>mod) {
res-=res/mod*mod;
}
return res;
}
ll n;
int main(){
cin >> n;
v[0]=1;v2[0]=1;
for(int i=1;i<=52;++i){
v[i]=v[i-1]*3%mod;
v2[i]=v2[i-1]*2;
}
ll z=n%mod;
ans=(z+1)* ksm(2,mod-2)%mod*z%mod;
ans-=f(n);
ans=(ans%mod+mod)%mod;
cout << ans;
return 0;
}