算法竞赛入门经典训练指南
课后习题代码
sky_zdk
这个作者很懒,什么都没留下…
展开
-
uva 10883
#include#include#include#includeusing namespace std;int main(){ int T,t=1,n; scanf("%d",&T); while(T--) { scanf("%d",&n); double res=0,c1=0,t1=(n-1)*log(2); for(int i=0;i<n;i++)原创 2017-07-27 09:11:29 · 296 阅读 · 0 评论 -
LA 3720 Highway n x m的点阵 有多少条直线穿过至少2个点
#include#includeusing namespace std;int d[360][360],n,m;int gcd(int a,int b){ if(b==0) return a; else return gcd(b,a%b);}void init(){ for(int i=1;i<=300;i++) for(int j=1;j<=300;j++) {原创 2017-07-27 10:33:45 · 539 阅读 · 0 评论 -
LA 5846 n个点 任意2点间有一条红色,或者蓝色边 求单色三角形的个数
#include#includeusing namespace std;int d[1060][1060];int main(){ int T,n; scanf("%d",&T); while(T--) { int res=0; scanf("%d",&n); for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) {原创 2017-07-27 10:50:38 · 921 阅读 · 0 评论 -
uva 11529 求一个平面内有多少个凸边形 或者求所有三角形包含点的总个数
#include#include#include#include#define PI acos(-1.0)using namespace std;struct node{ double x,y;}p[1260];double d[2560],res;double C(int n,int m){ double ans=1; if(m>n) return 0; for(原创 2017-07-28 10:41:31 · 324 阅读 · 0 评论 -
LA 4064 求n个点 可以组成多少个锐角或者直角三角形
#include#include#include#include#define eps 1e-8#define PI acos(-1.0)using namespace std;struct node{ double x,y;}p[1260];double d[2560];int dcmp(double x){ if(fabs(x)<eps) return 0; e原创 2017-07-28 12:20:19 · 1303 阅读 · 0 评论 -
uva 1350
#include#includeusing namespace std;int dp[1001],sum[1001];void init(){ dp[1]=dp[2]=1; for(int i=3;i<=100;i++) dp[i]=dp[i-1]+dp[i-2]; sum[0]=0; for(int i=1;i<=100;i++) { sum[i]=sum[i-1]+d原创 2017-07-28 15:00:59 · 214 阅读 · 0 评论 -
uva 11645 求连续的11有多少个
#include#includeusing namespace std;const long long MOD=1e13;long long a,b,x;void add(long long t){ b+=t; a+=b/MOD; b%=MOD;}void solve(){ long long l=1,r=x; a=0,b=0; while(r) { add((原创 2017-07-28 15:58:45 · 246 阅读 · 0 评论 -
uva 11481 一个序列前m个中有k个不动,其他可动可不动 共有几种情况
#include#include#define MOD 1000000007using namespace std;int n,m,k;long long res,d[1060],c[1060][1060];;void init(){ d[0]=1; d[1]=0; for(int i=2;i<=1000;i++) d[i]=((d[i-1]+d[i-2])%MOD * (i原创 2017-07-30 09:43:43 · 329 阅读 · 0 评论 -
uva 10237 n x n棋盘上放k个棋子 棋子不能在同一斜线上 求总类数
#include#includeusing namespace std;long long dp1[36][96],dp2[36][96];int n,k;void init(){ for(int i=0;i<=36;i++) dp1[i][0]=dp2[i][0]=1; for(int i=1;i<=36;i++) for(int j=1;j<=2*i-1;j++) {原创 2017-07-30 10:51:29 · 629 阅读 · 0 评论 -
uva 10673 exgcd
#include#include#includeusing namespace std;int exgcd(int a,int b,int &x,int &y){ int d=1; if(b==0) { x=1; y=0; return a; } else { d=exgcd(b,a%b,y,x); y-=(a/b)*x; } return d;}原创 2017-08-02 10:38:04 · 199 阅读 · 0 评论 -
uva 11490
#include#include#define MOD 100000007using namespace std;int main(){ long long s; while(~scanf("%lld",&s)&&s) { int flag=0; for(long long i=1;i*i*6<s;i++) { long long t=s-i*i*6; if原创 2017-08-02 12:52:06 · 244 阅读 · 0 评论 -
uva 11728
#include#include#includeusing namespace std;int main(){ int s,t=1; while(~scanf("%d",&s)&&s) { int i; for(i=s;i>=1;i--) { int num=0; for(int j=1;j<=sqrt(i);j++) { if(i%j==0)原创 2017-08-02 13:03:55 · 219 阅读 · 0 评论 -
指数循环节 uva 10692
#include#include#includeusing namespace std;int d[1000],n,m;int qcal(int a,int n,int m){ int res=1; while(n) { if(n&1) res=res*a%m; n>>=1; a=a*a%m; } return res;}int pcal(in原创 2017-08-02 14:37:57 · 210 阅读 · 0 评论 -
LA 4270 离散平方根
#include#include#includetypedef long long LL;using namespace std;LL X,n,r;void exgcd(LL a,LL b,LL &d,LL &x,LL &y){ if(b==0) { d=a; x=1; y=0; } else { exgcd(b,a%b,d,y,x); y-=(a/b)原创 2017-08-03 10:20:28 · 335 阅读 · 0 评论 -
LA 4079 高斯素数 高斯整数
#include#include#include#includeusing namespace std;int ok(int x){ for(int i=2;i<=(int)sqrt(x+0.5);i++) { if(x%i==0) return 0; } return 1;}int main(){ int T,a,b; scanf("%d",&T); wh原创 2017-08-03 11:43:06 · 424 阅读 · 0 评论 -
uva 11014 三维空间中不共线的点
#include#includeusing namespace std;typedef long long LL;int prime[200010],cnt,vis[200010];LL cal(LL x){ return x*x*x-1;}void init(){ for(int i=2;i<=200002;i++) { if(!vis[i]) for(int j原创 2017-09-04 13:15:13 · 288 阅读 · 0 评论 -
uva 1404 求很大数的素数算法
#include#include#define MAX(x,y) ((x)>(y)?(x):(y))using namespace std;int prime[50050],cnt,vis[50050],ans[1000000];bool flag[200000000];void init(){ for(int i=2;i<=50000;i++){ if(!vis[i]){原创 2017-09-04 16:58:25 · 222 阅读 · 0 评论 -
uvalive 4998 高次幂的求模 (同余)
#include#includeusing namespace std;typedef long long LL;const long long MOD=1e12;int flag;LL k1,k2;LL multi(LL a,LL b,LL mod){ LL l=a * (b>>20) % mod * (1LL<<20) % mod; LL r=a * (b&((1LL<<20原创 2017-09-05 12:16:59 · 447 阅读 · 0 评论 -
uva 1521 一推数 分成若干组 每组的数相乘不能超过n 求最小分组
#include#includeusing namespace std;int vis[10020],prime[10020],cnt,n;void init(){ for(int i=2;i<=10010;i++){ if(!vis[i]){ for(int j=i+i;j<=10010;j+=i) vis[j]=1; prime[cnt++]=i; } }原创 2017-09-05 20:07:18 · 274 阅读 · 0 评论 -
poj 2800 LA 5916 求一个数模1到n 得到的和
#include#include#includetypedef long long LL;using namespace std;int main(){ LL n,k,t; while(~scanf("%lld%lld",&n,&k)){ LL res=0; if(n>k) res+=(n-k)*k; LL len=(LL)sqrt((double)k); for(i原创 2017-09-05 20:56:08 · 254 阅读 · 0 评论 -
LA4382&&hdu2973
LA4382&&hdu2973威尔逊定理若p为素数,则(p−1)!=−1(modp)(p-1)!=-1(mod p)#include<cstdio>#include<cstring>using namespace std;bool vis[3002000];int ans[3000500];void init(){ for(int i=2;i<=3000100;i++){原创 2017-09-05 21:43:42 · 295 阅读 · 0 评论 -
LA 4384 求把一个矩形分成长宽相等的若干小矩形
#include#includeusing namespace std;int ok(int a,int b,int d){ for(int i=a;i<d;i+=a){ if((d-i) % b == 0) return 1; } return 0;}int main(){ int T,a,b,c,d; scanf("%d",&T); while(T--){ s原创 2017-09-06 07:58:15 · 900 阅读 · 0 评论 -
uva 12293 博弈
#include#includetypedef long long LL;using namespace std;LL res[100000],cnt,n;void init(){ cnt=1; res[0]=3; while(1){ res[cnt]=res[cnt-1]*2+1; if(res[cnt]>1000000000) break; cnt++; }原创 2017-09-06 08:19:14 · 198 阅读 · 0 评论 -
uva 11892 ENimEN
#include#includeusing namespace std;int main(){ int T,t,n; scanf("%d",&T); while(T--){ scanf("%d",&n); int flag=0; for(int i=0;i<n;i++){ scanf("%d",&t); if(t>1) flag=1; } if(f原创 2017-09-06 09:03:00 · 225 阅读 · 0 评论 -
uva 10491 概率
首先我们有 aa+b\frac{a}{a+b}的概率选出错误的 之后我们又有 ba+b−c−1\frac{b}{a+b-c-1}的概率换成正确的。 同理 : 还有ba+b\frac{b}{a+b}的概率选出正确的,之后有b−1a+b−c−1\frac{b-1}{a+b-c-1}的概率还是换成正确的 。 这样把2个可能加起来就行了。 #include<cstdio>#include<cstrin原创 2017-09-06 12:05:42 · 180 阅读 · 0 评论 -
uva 11637
#include#include#include#includeusing namespace std;long double fac[100010];void init(){ for(int i=1;i<100010;i++) fac[i]=fac[i-1]+log((long double)i); }double solve(int n,int k){ if(n==1)原创 2017-09-06 18:14:44 · 237 阅读 · 0 评论 -
uva 11605 概率 化简公式
给一个数 每次加1的概率固定的 求k次后 他是奇数的概率 (可用公式直接推到出来 不用模拟)原创 2017-09-06 18:52:01 · 437 阅读 · 0 评论 -
uva 10655 公式变形 矩阵快速幂
#include#includetypedef long long LL;using namespace std;struct matrix{ LL d[3][3];};matrix cal(matrix a,matrix b){ matrix c; for(int i=0;i<2;i++) for(int j=0;j<2;j++){ c.d[i][j]=0; for(原创 2017-09-07 06:53:04 · 245 阅读 · 0 评论 -
uva 11149 矩阵快速幂 求矩阵1-n次幂的和
#include#include#define mod 10using namespace std;int n;struct matrix{ int d[50][50];};matrix add(matrix a,matrix b){ matrix c; memset(c.d,0,sizeof(c.d)); for(int i=0;i<n;i++) for(int j=0;原创 2017-09-07 08:14:31 · 317 阅读 · 0 评论 -
uva 10668 二分
#include#include#include#define PI acos(-1.0)using namespace std;double L,n,C;double cal(double rad){ return L*rad/sin(rad);}int main(){ while(scanf("%lf%lf%lf",&L,&n,&C)==3&&L>=0){ double原创 2017-09-07 09:35:00 · 195 阅读 · 0 评论 -
uva 10385 一个单峰函数(由min(很多一次函数)构成)和一个一次函数的差值 也是单峰函数
#include#include#include #includeusing namespace std;int n;double t,v1[100],v2[100];double cal(double r){ double res=100000000,k=t-r; double s=r/v1[n-1]+k/v2[n-1]; for(int i=0;i<n-1;i++){原创 2017-09-07 10:52:42 · 438 阅读 · 0 评论 -
uva 11988
#include#includeusing namespace std;char str[100010];int next[100010];int main(){ int cur,last; while(scanf("%s",str+1)==1){ int n=strlen(str+1); int cur=last=0; for(int i=1;i<=n;i++){原创 2017-09-07 12:42:35 · 155 阅读 · 0 评论 -
uva 11987 并查集
#include#include#define N 200020using namespace std;int pre[N],num[N],sum[N];int find(int x){ return pre[x]==x?x:find(pre[x]); }void merge(int x,int y,int op){ int t1=find(x); int t2=find(y)原创 2017-09-07 20:02:36 · 169 阅读 · 0 评论 -
uva 11525 树状数组 求第k大数
#include#includeusing namespace std;int bit[50050],n;void add(int x,int v){ while(x<=n){ bit[x]+=v; x+=x&-x; }}int sum(int x){ int res=0; while(x>0){ res+=bit[x]; x-=x&-x; } retu原创 2017-09-07 21:19:04 · 329 阅读 · 0 评论 -
uva 11488 字典树
#include#include#includeusing namespace std;int ch[100010][2],cnt[100010],sz;int res=0;void insert(char str[]){ int len=strlen(str),cur=0; for(int i=0;i<len;i++){ int c=str[i]-'0'; if(!ch[原创 2017-09-08 14:24:00 · 213 阅读 · 0 评论 -
uva 1264 Binary Search Tree 计数
#include#include#define MOD 9999991 #define LL long longLL c[36][36];int ch[36][2],num[36];using namespace std;void init(){ c[0][0]=1; for(int i=1;i<=23;i++){ c[i][i]=1;c[i][0]=1; for(int原创 2017-09-09 08:09:39 · 219 阅读 · 0 评论 -
LA 3525 Wild West 单调性
#include#include#includeusing namespace std;int dp[200010],a[200010],l[200010],r[200010];int main(){ int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) sca原创 2017-09-09 10:46:17 · 345 阅读 · 2 评论 -
uva 10054 欧拉回路
#include#include#includeusing namespace std;int num,G[100][100],d[100];void euler(int x){ for(int i=1;i<=num;i++) if(G[x][i]){ G[x][i]--; G[i][x]--; euler(i); printf("%d %d\n",i,x); }原创 2017-09-12 20:13:17 · 174 阅读 · 0 评论 -
LA 4255 给定一些数的关系 求这些的一组确定的值
#include#include#includeusing namespace std;int G[20][20],sum[20],in[20],n;void solve(){ queueq; int cnt=0; for(int i=0;i<=n;i++) if(!in[i]) q.push(i); while(!q.empty()){ int x=q.front();原创 2017-09-12 21:07:25 · 155 阅读 · 0 评论 -
uva 11396 二分图判定 (每条边连接的点不在同一范围内)
#include#includeusing namespace std;struct node{ int to,next;}e[10000]; int head[10000],cnt,vis[100000];void add_edge(int from,int to){ e[cnt].to=to; e[cnt].next=head[from]; head[from]=cnt++原创 2017-09-18 09:05:02 · 375 阅读 · 0 评论