首页 > 代码库 > BZOJ3560: DZY Loves Math V
BZOJ3560: DZY Loves Math V
虽然不是很神的题,不过拿短代码搞到rank1了那么纪念下。
先观察样例。
6=2*3;
10=2*5;
15=3*5;
对应答案:1595=5*11*29;
其中:
5=((1+2)*(1+2)*1*(2-1)+1)/2
11=((1+3)*1*(1+3)*(3-1)+1)/3
29=(1*(1+5)*(1+5)*(5-1)+1)/5
证明不写了……自行领会精神。
就是对每个n因数分解后对每个p分开搞搞。
【代码】(话说好不容易才发现插入代码这功能)
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 #define rep(i,j,n) for(int i=j;i<=n;i++) 7 char c;template<class T> inline void read(T&x){for(c=getchar();c<‘0‘||c>‘9‘;c=getchar());for(x=0;c>=‘0‘&&c<=‘9‘;c=getchar())x=x*10+c-‘0‘;}; 8 const int N=10000000,M=664580,mod=1000000007; 9 int ta,tb,n,x,phi[N+1],p[M];10 long long tc,td,d[M];11 bool pd[N+1];12 void pre(){13 pd[1]=1;14 rep(i,2,N){15 if(!pd[i])p[++p[0]]=i,phi[i]=p[0];16 for(int j=1,mul;j<=p[0]&&(mul=i*p[j])<=N;j++){17 pd[mul]=1;phi[mul]=j;18 if(i%p[j]==0)break;19 }20 }21 rep(i,1,p[0]) d[i]=1;22 memset(pd,false,sizeof(pd));23 }24 int main(){25 pre();26 read(n);27 rep(i,1,n){28 read(x);29 while(x>1){30 ta=phi[x];tb=1;tc=1;31 while(x%p[ta]==0){32 tc=tc*p[ta]%mod;33 tb=tb+tc;34 if(tb>=mod)tb-=mod;35 x/=p[ta];36 }37 d[ta]=d[ta]*tb%mod;38 pd[ta]=true;39 }40 }41 tc=1;td=1;42 rep(i,1,p[0]) if(pd[i]){43 tc=tc*(d[i]*(p[i]-1)%mod+1)%mod;44 td=td*p[i]%mod;45 }46 ta=mod-2;47 while(ta){48 if(1&ta) tc=tc*td%mod;49 td=td*td%mod;50 ta>>=1;51 }52 printf("%lld\n",tc);53 }
BZOJ3560: DZY Loves Math V
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。