2018 11.1 PION 模拟赛
期望:250 100+100+50
实际:210 80+100+30
期望:100 实际:80
最后;两个点T了。可能是求逆元的方法太慢了,也可能是闲的又加了一个快速乘的原因。
#include<cmath> #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mod 1000000007 using namespace std; int n,m; long long ans; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } long long qmul(long long x,long long m){ long long ret=0; while(m){ if(m&1) ret=(ret+x)%mod; x=(x+x)%mod; m>>=1; } return ret; } long long ksm(long long a,long long n){ long long ret=1; while(n){ if(n&1) ret=qmul(ret,a)%mod; a=qmul(a,a)%mod; n>>=1; } return ret; } long long ex_gcd(long long a,long long b,long long &x,long long &y,long long &d){ if(!b){ x=1;y=0;d=a; } else{ ex_gcd(b,a%b,y,x,d); y-=(a/b)*x; } } long long inv(long long t,long long p){ long long d,x,y; ex_gcd(t,p,x,y,d); return d==1?(x%p+p)%p:-1; } int main(){ //freopen("lpp.in","r",stdin); freopen("sum.in","r",stdin); freopen("sum.out","w",stdout); n=read();m=read(); for(int i=1;i<=n;i++){ if(i==1){ ans+=m;ans%=mod; } else{ long long tmp=(ksm(i,m)-1)*inv((i-1),mod); ans=ans+qmul(tmp,i); ans%=mod; } } cout<<ans; }
后来明确了,就是因为在快速幂里套了一个快速乘,所以T了两个点。
#include<cmath> #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mod 1000000007 using namespace std; int n,m; long long ans; int inv[50010]; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } long long qmul(long long x,long long m){ long long ret=0; while(m){ if(m&1) ret=(ret+x)%mod; x=(x+x)%mod; m>>=1; } return ret; } long long fastpow(long long a,long long b){ long long s=1; for(;b;b>>=1){ if(b&1) s=s*a%mod; a=a*a%mod; } return s; } int main(){ //freopen("lpp.in","r",stdin); freopen("sum.in","r",stdin); freopen("sum.out","w",stdout); n=read();m=read(); inv[1]=1; for(int i=2;i<=50000;i++) inv[i]=(mod-mod/i)*1ll*inv[mod%i]%mod; for(int i=1;i<=n;i++){ if(i==1){ ans+=m;ans%=mod; } else{ ans=ans+((fastpow(i,m)-1)*i)%mod*inv[i-1]; ans%=mod; } } cout<<ans; }