我叫张小黑
张小黑的挣扎生活
posts - 66,  comments - 109,  trackbacks - 0
http://acm.pku.edu.cn/JudgeOnline/problem?id=2480
 这道题改了两天,里面用到了整数因子分解,筛选素数,求欧拉函数,
以下是和partychen的聊天记录,既然他把那么难敲得证明都
敲出来了,那我就只接捻好了HOHO~~
主要公式sima(N/pi)*pi
另外这个公式是可积的
陈俊奎 10:13:35
m的约数为x1,x2,x3...xp
陈俊奎 10:13:48
n的约数为y1,y2,y3....yp
陈俊奎 10:14:05
那么有gcd(xi,yi)=1
陈俊奎 10:15:14
那么m*n的任意约数T,有唯一分解T=xi*yj
陈俊奎 10:16:47
T*E(m*n/T)=xi*yi*E(m/xi* n/ yj)=xi*E(m/xi)*yj*E(n / yj)
陈俊奎 10:18:09
f(m*n)=sima(xi*E(m/xi)*yj*E(n / yj))=(sima(xi*E(m/xi))*(sima(yj*E(n/ yj)))=f(m)*f(n)
陈俊奎 10:19:31
f(12)=f(2^2)*f(3)
陈俊奎 10:20:00
f(3)=1*E(3)+3*E(1)=2+3=5
陈俊奎 10:21:14
f(2^2)=1*E(2^2)+2*E(2)+4*E(1)=(2-1)*2^(2-1)+2*(2-1)+4*1
陈俊奎 10:21:25
=2+2+4=8
 1#include<iostream>
 2using namespace std;
 3#define Max_N 50000
 4#define Max_P 5200
 5#define __int64 _int64
 6int Prime[Max_N];//对素数的标记
 7int P_div[Max_P];//存储素数约数
 8int P_mi[Max_P];//存储素数约数的幂
 9void init()//筛选素数
10{
11    _int64 i,j;
12    for(i=2;i<Max_N;i++)
13        if(!Prime[i])
14            for(j=2;j*i<Max_N;j++)Prime[j*i]=1;
15}
16_int64 phi(int p,int e)//欧拉
17{
18    if(e==0||p==1)return 1;
19    if(e==1)return p-1;
20    _int64 i;
21    _int64 result=1;
22    for(i=1;i<e;i++)
23        result*=p;
24    result*=(p-1);
25    return result;
26}
27int get(int i,int e)
28{
29    int j;
30    int r=1;
31    for(j=e;j<P_mi[i];j++)
32        r*=P_div[i];
33    return r;
34}
35int factorization(int n)//整数因子分解
36{
37    int i,j=0;
38    for(i=2;i<Max_N&&n>1;i++)
39        if(!Prime[i]&&n%i==0){
40            P_div[j]=i;
41            while(n%i==0){
42                ++P_mi[j];
43                n/=i;}
44            j++;}
45        if(i>=Max_N||!j){//好重要的疏漏!!!大素数因子没有存入P_div中
46            P_div[j]=n;//吸取教训的地方!!
47            P_mi[j++]=1;}
48        return j;
49}
50int main()
51{
52    //freopen("1.in","r",stdin);
53    //freopen("1.ans","w",stdout);
54    int N;
55    int i,j,t,h,tmp1;
56    _int64 tmp2;
57    _int64 result,p;
58    memset(Prime,0,sizeof(Prime));
59    init();
60    while(scanf("%d",&N)!=EOF){//
61        result=1;
62        memset(P_div,0,sizeof(P_div));
63        memset(P_mi,0,sizeof(P_mi));
64        t=factorization(N);
65        for(i=0;i<t;i++){
66                for(p=0,j=0,h=1;j<=P_mi[i];j++){
67                    tmp1=get(i,j);
68                    tmp2=phi(P_div[i],j);
69                    p+=tmp2*tmp1;}
70                result*=p;}
71        printf("%I64d\n",result);
72    }    
73    return 0;
74}
posted on 2008-03-01 20:19 zoyi 阅读(369) 评论(0)  编辑 收藏 引用 所属分类: acm

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


欢迎光临 我的白菜菜园

<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(8)

随笔分类

随笔档案

文章档案

相册

acmer

online judge

队友

技术

朋友

搜索

  •  

最新评论

阅读排行榜

评论排行榜