好久没爬了……尝试着打了一下顺便练习写部落格……
【1001】【hdu5086】
很简单的找规律题?每个点找一下一共出现了多少次就行了。。O(n)
#include <iostream>
#include <cstdio>
using namespace std;
#define MOD 1000000007
long long N,M;
int main(){
int T;
long long res;
long long tmp;
long long t2;
cin>>T;
while(T--){
scanf("%d",&N);
tmp=N-1;
res=0;
for(int i=0;i<N;++i){
tmp=(i+1)*(N-i);
tmp%=MOD;
scanf("%I64d",&t2);
res+=t2*tmp;
res%=MOD;
}
printf("%I64d\n",res%MOD);
}
return 0;
}
【1002】【hdu5087】
赛的时候看到N=1000 T=100时思考了一下觉得N^2的算法会T然后就随便搞了个NlogN的算法……然后就果断挂ST了……
赛后看了题解,N^2的算法目测挺简单的,大约就是dp的时候处理一下每个点的种类数?
于是就懒的写了……
【1003】【hdu5088】
其实就是找N个数中是不是能取到(元素数不少于一的)一部分,使他们的异或和为0。然后把每个数都考虑成Z_2上的方程,比如说6二进制是110对应的方程就是x^2+x=0。10的二进制是1010对应的方程就是x^3+x=0。然后看看这个方程组的秩是不是等于方程数(N)。如果等于就说明无法取出这样的一部分。A[i]范围是1e12,所以当N>41时肯定秩比方程数小。然后不要忘了用long long。。
我大概算是用高斯消元判定是不是能化简出0=0的等式(如果能化简出就说明秩!=N)。因为在Z_2上所以方程加减直接用int做xor操作就可以了。
当然我的高斯消元写的很烂。题解上说是O(40),我大概是O(40^2log40)?。。总之不要在意细节。。
#include <iostream>
#include <algorithm>
using namespace std;
int T,N;
long long arr[1003];
int main(){
cin>>T;
while(T--){
cin>>N;
for(int i=0;i<N;++i)
cin>>arr[i];
if(N>40)
cout<<"Yes"<<endl;
else{
std::sort(arr,arr+N);
for(int k=41;k>=0;--k){
if(arr[N-1]< (1<<k))
continue;
for(int i=N-2;i>=0&&arr[i]>=(1<<k);--i)
arr[i]^=arr[N-1];
if(--N==0)
break;
std::sort(arr, arr+N);
}
if(arr[0]==0)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
return 0;
}
【1004】【hdu5089】
目前看还是0A。。我觉得肯定是能算出来一个很厉害很厉害的数学公式吧?大概……
反正我不会!
p.s.我果然还是不适合写文档。。