周末总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luodanyu_/article/details/78088270

在这一周,每天都是做完作业就刷题,而周四则更是先编了两个程序过了一下瘾,才写的周末作业,感觉对编程的热爱只增不减。同时每天都跑两圈,感觉十分充实。

然而,在我编程的过程中,也发现了许多的不足之处。许多新知识我都没有学过,且有些刚学过的东西还没写熟,甚至还会看一眼标程,不得不说还要继续努力。

同时,我的思维能力有所提高,在遇到一道新题时,能够有思路且接近一半都是正确的(当然DP却不能很快的想出状态转移方程)。并且学长讲的课也能听懂了,有时还觉得挺简单的,甚至比他人想的快(鼓掌)。总体来说,还是可以的。

可是考试的成绩却不理想,因此我要 勤学苦练多刷题,专心致志上自习 以来提高能力。

附.题(日后可以回看)

【问题描述】
给出n个正整数a1,a2…an和一个质数mod.一个变量x初始为1.进行m次操 作.每次在 n 个数中随机选一个 ai,然后 x=x*ai%mod.问 m 次操作之后 x 的取值的 期望. 答案一定可以表示成 a/b 的精确分数形式.a 和 b 可能很大,所以只需要输出 a*(b^(10^9+5))模 10^9+7 的结果.
【输入文件】
第一行三个整数 n,m,mod. 接下来一行 n 个空格隔开的正整数 a1,a2…an。
【输出文件】
一行一个整数表示答案。
【输入样例】
510000000002 11111
【输出样例】
1
【数据规模和约定】
第 1 个测试点:mod=2 第 2 个测试点:n=1 第 3,4,5 个测试点:m<=1000,1<=mod<=300. 第 6,7,8 个测试点: 1<=mod<=300 对于全部测试点:1<=ai<mod,mod 为质数 1<=mod<=1000, 对于全部测试点:1<=n<=10^5,1<=m<=10^9

//认真思考//

//认真思考//

//认真思考//

//认真思考//

//认真思考//

题解:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define mod 1000000007
using namespace std;
int n,m,p;
long long mi(long long x){//快速幂 好写法
long long y=1;
for(int k=mod-2;k;k/=2){
if(k&1)y=y*x%mod;
x=x*x%mod;//x=(x*x)%mod
}
return y;
}
int fa=0,pp=0;
long long f[1001][2],t[1001][2];
void go(){
while(m){
if(m&1){
fa=fa^1;
for(int i=1;i<p;i++)f[i][fa]=0;
for(int i=1;i<p;i++){
for(int j=1;j<p;j++){
f[i*j%p][fa]+=f[i][fa^1]*t[j][pp]%mod;
}
}
for(int i=1;i<p;i++){
f[i][fa]%=mod;
}
}
pp=pp^1;
for(int i=1;i<p;i++)t[i][pp]=0;
for(int i=1;i<p;i++){
for(int j=1;j<p;j++){
t[i*j%p][pp]+=t[i][pp^1]*t[j][pp^1]%mod;
}
}
for(int i=1;i<p;i++)t[i][pp]=t[i][pp]%mod;
m/=2;
}
}
int zc,mi_n;//暂存,n的快速幂
long long ans;
int main(){
scanf("%d%d%d", &n, &m, &p);
for(int i=0;i<n;i++){
scanf("%d", &zc);
t[zc][pp]++;
}
int mi_n=mi(n);
for(int i=1;i<p;i++){
t[i][pp]=(t[i][pp]*mi_n)%mod;
}
f[1][fa]=1;
go();
for(int i=1;i<p;i++){
ans=(ans+f[i][fa]*i)%mod;
}
printf("%lld\n", ans);
return 0;
}
//标程地址: http://floj.cf/submission/25422
//伪代码地址: http://floj.cf/submission/25421

阅读更多
换一批

没有更多推荐了,返回首页