【题A】
【题解】
易得,木棍能到达的点的距离原点的范围为[max(0,abs(l1-l2),l1+l2],分类讨论即可。
【代码】
#include<bits/stdc++.h>
using namespace std;
int main()
{
int l1,l2,t; scanf("%d%d%d",&l1,&l2,&t);
double l=abs(l1-l2),r=l1+l2;
while(t--)
{
double x,y; scanf("%lf%lf",&x,&y);
double d=sqrt(x*x+y*y);
double ans;
if(d<l) ans=l-d;
else if(d>r) ans=d-r;
else ans=0;
printf("%.8lf\n",ans);
}
return 0;
}
【题G】
【题解】
根据唯一分解定理,任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的。换句话说,一个数能被唯一地分解成质因数的乘积。
公式:n = P1^a1 * P2^a2 * …………* (P1 < P2 < ……Pn);
利用类似素数一般筛即埃式筛法来对因子数计数,取一个数i,并令i的倍数的因子数+1。
(对素数筛感兴趣的传送门这里:判断素数(一般筛到线性筛))
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+1;
int ans[maxn],cnt[maxn]={0};
int main()
{
memset(ans,-1,sizeof(ans));
for(int i=1;i<maxn;i++)
{
for(int j=i;j<maxn;j+=i)
cnt[j]++;
if(ans[cnt[i]]==-1) ans[cnt[i]]=i;
}
int n,t; scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%d\n",ans[n]);
}
return 0;
}
【题J】
【题解】
易得,每一位只有在(0,0)(0,1)(1,0)的三种情况时满足条件,答案即为3^M。
【代码】
#include <bits/stdc++.h>
const int mod=998244353;
typedef long long ll;
ll quick_pow(ll a,ll b)
{
ll tmp=a;
ll sum=1;
while(b)
{
if(b&1) sum=sum*tmp%mod;
tmp=tmp*tmp%mod;
b>>=1;
}
return sum;
}
int main()
{
int m; scanf("%d",&m);
printf("%lld\n",quick_pow(3,m));
return 0;
}