您的位置:首页 > 其它

NOIP2014提高组Day2

2017-10-19 09:23 302 查看
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 long
using 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的就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: