标签:neu bottom 电量 top while efi 递增 考试 return
求组合数取模
复习了一下取模质数是阶乘逆元的O(n)递推求法,
可用于O(1)求组合数
代码#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int mod=2000003;
int fac[2000005],inv[2000005];
int power(int a,int b)
{
int val=1;
while(b)
{
if(b&1) val=(1ll*val*a)%mod;
a=(1ll*a*a)%mod; b>>=1;
}
return val;
}
void pre_fac_inv(int n)
{
fac[0]=fac[1]=1;
for(int i=2;i<=n;i++) fac[i]=(1ll*fac[i-1]*i)%mod;
inv[n]=power(fac[n],mod-2);
for(int i=n;i>1;i--) inv[i-1]=(1ll*inv[i]*i)%mod;
inv[0]=inv[1];
}
int c(int m,int n)
{
return 1ll*fac[m]*inv[m-n]%mod*inv[n]%mod;
}
int main(){
int n;
scanf("%d",&n);
pre_fac_inv(2*n);
int ans=(c(2*n-1,n-1)-n+mod)%mod;
printf("%d",(ans*2+n)%mod);
return 0;
}
统计两个数组:
v[k]表示同类小于等于k的蛋糕的总数量
w[k]表示同类大于等于k的蛋糕有多少种
那么对于一个k是否可成为答案(即可否分成k组),只需满足:
v[k]+w[k]*3>=3*k
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int w[3000005],v[3000005];
int cnt[3000005],n,r;
int main(){
scanf("%d",&n);
for(int i=1,a;i<=n;i++) scanf("%d",&a),cnt[a]++,r=max(r,a);
for(int i=1;i<=r;i++) w[cnt[i]]++,v[cnt[i]]+=cnt[i];
for(int i=1;i<=n;i++) v[i]+=v[i-1];
for(int i=n;i>=1;i--) w[i]+=w[i+1];
for(int k=n/3;k>=1;k--){
if(v[k-1]+w[k]*k>=3*k){
printf("%d",k);
break;
}
}
return 0;
}
随着用电量的增加,电费单调递增
既然有了单调性,那么二分就好了
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
ll allfi,allused,derfi,oneused;
ll cal(ll used){
ll fi=0;
if(used<=100) fi+=2*(used-0);
else{
fi+=2*(100-0);
if(used<=10000) fi+=3*(used-100);
else{
fi+=3*(10000-100);
if(used<=1000000) fi+=5*(used-10000);
else{
fi+=5*(1000000-10000);
fi+=7*(used-1000000);
}
}
}
return fi;
}
ll binary_search(){
ll l=1,r=1000000000,mid,ans;
while(l<=r){
mid=(l+r)>>1;
if(cal(mid)<=allfi) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
ll binary_sssssssssearch(){
ll l=1,r=allused/2,mid,ans;
while(l<=r){
mid=(l+r)>>1;
if(cal(mid)+derfi<=cal(allused-mid)) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int main(){
scanf("%lld%lld",&allfi,&derfi);
allused=binary_search();
oneused=binary_sssssssssearch();
printf("%lld",cal(oneused));
return 0;
}
标签:neu bottom 电量 top while efi 递增 考试 return
原文地址:http://www.cnblogs.com/zj75211/p/7624024.html