20200908 day3 刷题记录

代码背诵:素数筛,素数判断,质因数分解,逆元

1 逆元

代码:

inv[1]=1;
for(int i=1;i<=n;i++){
	inv[i]=(p-p/i)*inv[p%i]%p;
}

2 1008 放球

题意

共m个球,第k个箱子里放\(2^k\)或不放,恰好放完,求方案。

题解

转化为二进制,每一位上的0或1表示是否放。

未AC原因

二进制理解不熟练,尝试使用递归和动态规划未果

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

int quick_pow(int x,int y){
  if(y==0) return 1;
  if(y==1) return x;
  if(y%2==0){
    y/=2;
    return quick_pow(x,y)*quick_pow(x,y);
  }
  if(y%2!=0){
    y/=2;
    return quick_pow(x,y)*quick_pow(x,y)*x;
  }
}


int main()
{
  int m,i=0;
  scanf("%d",&m);
  while(m>=1){
    int a = m % 2;
    if(a){
      int b = pow(2,i);
      printf("%d:%d\n",i,b);
    }
    else{
      printf("%d:0\n",i);
    }
    i++;
    m >>= 1;
  }
  return 0;
}

3 1010 求级数和

题意

给定\(N\),求\(S\)\(S=\dfrac{1}{1!}+\dfrac{1}{2!}+...+\dfrac{1}{N!}\)

题解

模拟。高精度浮点数

理解

加上一个极其小的数????????????????

代码

#include<cstdio>
int n,i;
double jiecheng,ans;

int main(){
scanf("%d",&n);
jiecheng=1;
for (int i=1;i<=n;i++){
jiecheng=jiecheng*i;
ans+=(1/jiecheng)+0.000000000000000003;
}
printf("%.15f",ans);
return 0;
}

4 KMP

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define maxn 1000010
int kmp[maxn];
int la,lb,j;
char a[maxn],b[maxn];
int main(){
  scanf("%s %s",a+1,b+1);
  la=strlen(a+1);
  lb=strlen(b+1);
  for(int i=2;i<=lb;i++){
    while(j&&b[i]!=b[j+1]) j=kmp[j];
    if (b[j+1]==b[i]) j++;
    kmp[i]=j;
  }
  j=0;
  for(int i=1;i<=la;i++){
    while(j>0&&b[j+1]!=a[i]) j=kmp[j];
    if(b[j+1]==a[i]) j++;
    if(j==lb) {
      printf("%d \n",i-lb+1);j=kmp[j];
    }
  }
  for(int i=1;i<=lb;i++){
    printf("%d ",kmp[i]);
  }
  return 0;
}

5 1013 周期串

题意

求字符串最小周期
abab:2,aaaa:1,abcd:4

题解

从1枚举最小周期,依次判断是否符合题意(可以通过若干次字符串pos和delete,或者循环方法实现)。
时间复杂度\(O(N^2)\),空间复杂度\(O(N)\)

理解

字符串该复习了

#include<cstdio>
#include<cstring>
char s[305];
int len,t;

bool pan(int a){
if (len % a != 0) return false;
for (int i=a+1;i<len;i++) if (s[i]!=s[i%a]) return false;
return true;
}


int main(){
scanf("%s",s);
len=strlen(s);
t=1;
while (!pan(t)) ++t;
printf("%d",t);
return 0;
}
posted @ 2020-09-08 08:43  刘子闻  阅读(102)  评论(0编辑  收藏  举报