A 锯锯锯锯锯锯锯锯锯锯锯锯锯锯
考虑数据范围1e8,所以我们仅记录有用的查询值,而不是记录所有的。
const ll mod = 1e9+7; const int N= 1e5+7; ll n,a[N],x[N],y[N],q[N<<1],cnt=0,ans[N<<1]; ll qpow(ll a,ll b){ ll ans=1; while(b){ if(b&1)ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } int main(){ scanf("%lld",&n); for(int i=1;i<=n;++i){ scanf("%lld%lld",&x[i],&y[i]); if(x[i]>y[i])swap(x[i],y[i]); q[++cnt]=x[i];q[++cnt]=y[i]; } sort(q+1,q+1+cnt); ll m= unique(q+1,q+1+cnt)-(q+1); ll res=1,pos=1; for(int i=0;i<=1e8;++i){ if(i==q[pos])ans[pos]=res,pos++; res=(1ll*res*res%mod+res)%mod; } for(int i=1;i<=n;++i){ ll aa=ans[lower_bound(q+1,q+1+m,x[i])-q]; ll bb=ans[lower_bound(q+1,q+1+m,y[i])-q]; printf("%lld ",1ll*bb*qpow(aa,mod-2)%mod); } return 0; }
B 每日咕咚
看题意理解一下,每个人在每个位置的贡献。
int n; double x,v,ans=0.0,a[1007][1007],d; int main(){ scanf("%d%lf%lf",&n,&x,&v); for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ scanf("%lf",&d); a[i][j]=d-v; } } for(int i=1;i<=n;++i){ double sum=0.0; for(int j=1;j<=n;++j){ sum=sum+(x*n)/a[i][j]; } ans=ans+sum/n; } printf("%.2lf ",ans); return 0; }
D 涛涛和策策的游戏
分解质因数,得到每个数字贡献的个数,进而化为nim博弈
int main(){ GetPrime(1e6); scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); } for(int i=1;i<=n;++i){//分解 if(a[i]==1){ a[i]=0; continue; } int cntt=0; int tmp=a[i]; if(isPrime[tmp]){ a[i]=1; } else{ for(int j=1;Prime[j]*Prime[j]<=a[i]&&j<=cnt;++j){ if(tmp%Prime[j]==0){ while(tmp%Prime[j]==0) tmp/=Prime[j],cntt++; } } if(tmp>1) cntt++; a[i]=cntt; } } int ans=a[1]; for(int i=2;i<=n;++i) ans=ans^a[i]; if(ans==0) printf("TT txdy! "); else printf("CC yyds! "); return 0; }
F 学长的白日梦
乘的时候会爆ll,所以快速乘一下。
ll t,x,i,ans; ll mul(ll a , ll b , ll mod){ ll ans = 0 ; while(b){ if(b&1){ ans = (ans + a) % mod ; } b >>= 1 ; a = (a + a) % mod; } return ans ; } ll qpow(ll x,ll y){ ll res=1; x=x%mod; while(y){ if(y&1)res=mul(res,x,mod); x=mul(x,x,mod); y>>=1; } return res%mod; } int main(){ scanf("%d",&t); while(t--){ scanf("%lld%lld",&x,&i); ans=qpow(x,i); printf("%lld ",ans); } return 0; }