NOIP2014提高组Day2

来源:互联网 发布:算法的确定性指的是 编辑:程序博客网 时间:2024/06/05 09:14

NOIP2014Day2

一、无线网路发射器选址

数据:对于100%,矩阵大小129*129(0-128),n∈[1,20],d∈[1,20]

看完题后想到的是二维前缀和,看完数据后发现没有关系,暴力也可以过,直接129*129*n 就行了

二、寻找到路

数据:对于100%,n∈[0,1e4],m∈[0,2e5]

看完题后想暴力,不是很会。

但是看完条件后,发现条件1只要从终点反向走一遍,就可以把所有到不了的点全部标记掉。然后连着那些点的点也要标记掉,这样剩下的点就都是出边连着的点能通向终点了

这么简单的题就不用Code了。

无奈我把起点设为了1,只有20分……

三、解方程

数据:
这里写图片描述

看完数据后暴力基本能过,但是a太大了,用上高精度直接算也就50分。

看式子发现只有+-*,那么就模。可以得到一个等式

f(x)%P=f(x%P)%P

有了这个等式,那就很好求了。一边读入一边模就行了。
注意模的时候要多弄几个,一个可能会有问题。

Code:

#include<bits/stdc++.h>#define Mod 1000000007#define ll long longusing namespace std;ll A[105];int B[1000005];char str[100];int main(){    int n,m;    scanf("%d%d",&n,&m);    for(int i=0;i<=n;i++){        scanf("%s",str);        int len=strlen(str);        int st=0;ll x=0;        if(str[0]=='-')st=1;        for(int j=st;j<len;j++)//边读边模            x=(1LL)*(x*10+str[j]-'0')%Mod;        if(st)A[i]=Mod-x;else A[i]=x;    }    int ans=0;    for(int i=1;i<=m;i++){        int x=0,h1=1;        for(int j=0;j<=n;j++){//对于每个m都求一遍            x=(1LL)*(x+h1*A[j])%Mod;            h1=(1LL)*h1*i%Mod;        }        if(!x)B[++ans]=i;    }    printf("%d\n",ans);    for(int i=1;i<=ans;i++)printf("%d\n",B[i]);    return 0;}

但是这样是n*m的,极限数据下是过不了的

还有一种方法,对于一个是x,如果x%P是可以的,那么x也是可以的
那么就只要求x%P的就可以了

原创粉丝点击