代码背诵:素数筛,素数判断,质因数分解,逆元
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
",i,b);
}
else{
printf("%d:0
",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
",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;
}