1009 Divisibility
题意:十进制下判断一个数n能否被3整除的方法是 判断n的各位数的和能否被3整除,现给你一个b和x,判断再b进制下能否用这种方法判断所有数能否整除x。
打表可以找规律。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
ll b,x;
int main()
{
cin>>t;
while(t--)
{
cin>>b>>x;
if(b%x==1)
puts("T");
else puts("F");
}
return 0;
}
1002 Little Rabbit’s Equation
直接枚举2到16进制下式子能否满足。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int t;
ll b,x;
char s[100];
bool check(int p,vector<int> a,vector<int> b,vector<int> c,int flag)
{
ll cnt1=0,cnt2=0,cnt3=0;
for(int i=0;i<a.size();i++)
if(a[i]>=p) return 0;
else cnt1=cnt1*p+a[i];
for(int i=0;i<b.size();i++)
if(b[i]>=p) return 0;
else cnt2=(cnt2*p+b[i]);
for(int i=0;i<c.size();i++)
if(c[i]>=p) return 0;
else cnt3=(cnt3*p+c[i]);
if(flag==0) return cnt1+cnt2==cnt3;
else if(flag==1) return cnt2+cnt3==cnt1;
else if(flag==2) return cnt1*cnt2==cnt3;
else return cnt2*cnt3==cnt1;
}
int main()
{
while(~scanf("%s",s))
{
vector<int> a[3];
int flag,len=strlen(s);
int cnt=0;
for(int i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')
a[cnt].push_back(s[i]-'0');
else if(s[i]>='A'&&s[i]<='F')
a[cnt].push_back(s[i]-'A'+10);
else
{
cnt++;
if(s[i]=='+') flag=0;
else if(s[i]=='-') flag=1;
else if(s[i]=='*') flag=2;
else if(s[i]=='/') flag=3;
}
}
int ans=-1;
for(int i=2;i<=16;i++)
if(check(i,a[0],a[1],a[2],flag))
{
ans=i;
break;
}
printf("%d\n",ans);
}
return 0;
}
1001 Road To The 3rd Building
将区间长度一样的放到一起,假设区间长度为i,那么前i个数分别被用了1到i次,后i个数分别被用了i到1次,中间的其他数都被用了i次,所以分别计算长度即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010,mod=1e9+7;
int t,n,a[N];
ll sum[N],pre[N],suf[N],qre[N],s[N],inv[N];
ll ksm(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
s[1]=inv[1]=1;
for(int i=2;i<N;i++) inv[i]=inv[mod%i]*(mod-mod/i)%mod;
for(int i=2;i<N;i++) s[i]=(s[i-1]+i)%mod;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",a+i),sum[i]=(sum[i-1]+a[i])%mod,pre[i]=(pre[i-1]+1ll*a[i]*i%mod)%mod;
qre[n+1]=suf[n+1]=0;
for(int i=n;i>=1;i--)
suf[i]=(suf[i+1]+a[i])%mod,qre[i]=(qre[i+1]+1ll*a[i]*(n-i+1)%mod)%mod;
ll ans=0;
for(int len=1;len<=n;len++)
{
int l=min(len,n-len+1);
ll res=(pre[l-1]+qre[n-l+2])%mod;
res=(res+(sum[n-l+1]-sum[l-1])*l%mod)%mod;
ans=(ans+res*inv[len]%mod)%mod;
}
printf("%lld\n",ans*ksm(s[n],mod-2)%mod);
}
return 0;
}