问我前面Day16都去哪了?
吃了
为了推销个人Blog,今天开始所有训练博客统一移到此博客更新
Soultion:奇奇怪怪的题???貌似玄学贪心可以A,但是我只考虑全涂横向和全涂竖向的情况,居然85,实属送分题
Code:(没A)
Soultion:其实很好写的Dp/递推,设f[i][j][k]表示i!j中第k号质数的数量,注意,k表示的是质数在质数表的位置而不是数字本身。
转移:f[i][j][k]=f[i-1][j][k]+f[i][j-1][k];(其实题目已经给你提供了)
然后处理j=0的边界条件即对f[i][0][k]中的i进行质因数分解
Code:
#include<bits/stdc++.h>
const int P=1000000009;
int Prime[210];
int F[1010][105][180],N,K;
using namespace std;
int main()
{
Prime[1]=2;
int Num=3,tot=1;
while(tot<180){
bool flag=false;
for(int i=2;i*i<=Num;i++)
if(Num%i==0)<% flag=1;break; %>
if(!flag) Prime[++tot]=Num;
Num++;
}
scanf("%d%d",&N,&K);
for(int i=1;i<=N;i++){
int A=i;
for(int j=1;Prime[j]<=A;j++){
while(A%Prime[j]==0) F[i][0][j]++,A/=Prime[j];
}
}
for(int i=1;i<=N;i++)
for(int j=1;j<=K;j++){
for(int k=1;k<=tot;k++) F[i][j][k]=(1ll*F[i][j-1][k]+1ll*F[i-1][j][k])%P;
}
long long Ans=1;
for(int i=1;i<=tot;i++)
Ans=(Ans*1ll*(F[N][K][i]+1))%P;
printf("%lld",Ans);
return 0;
}
Soultion:旋转坐标系将给定斜率直线作为x轴,求出每个点与原点构成直线在新坐标系上的截距,从小到大排序之后,相邻点构成的直线一定会比较小所以O(n)扫一遍即可
Code:
#include<bits/stdc++.h>
typedef double dl;
using namespace std;
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
dl K;
struct Node{
int X,Y;
dl T()
{
return 1.0*Y-K*X;
}
}Poi[2*100100];
bool cmp(Node a,Node b)<% return a.T()<b.T();%>
int main()
{
freopen("slope.in","r",stdin);
freopen("slope.out","w",stdout);
int N,P,Q;
scanf("%d%d%d",&N,&P,&Q);
K=1.0*P/Q;
for(int i=1;i<=N;i++) scanf("%d%d",&Poi[i].X,&Poi[i].Y);
sort(Poi+1,Poi+N+1,cmp);
dl Temp=1e9+7;
int Pos=0;
for(int i=1;i<N;i++){
double xx=(Poi[i+1].X-Poi[i].X),yy=(Poi[i+1].Y-Poi[i].Y);
dl Calc=1.0*yy/xx;
if(fabs(Calc-K)<Temp){
Temp=fabs(Calc-K);
Pos=i;
}
}
int Ans1=abs(Poi[Pos].X-Poi[Pos+1].X);
int Ans2=abs(Poi[Pos].Y-Poi[Pos+1].Y);
int Rikka=gcd(Ans1,Ans2);
printf("%d/%d",Ans2/Rikka,Ans1/Rikka);
return 0;
}