ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

fzu_1759(大数模除)


Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).

思路一:
        十进制做法,把B分解,一步一步求A^B mod C,这样最多是1000W。TLE。测试数据组肯定很多》=10

思路二:
        求A^x=1 mod C,直接求x=phi(C)就行。然后求A^B=A^(B mod C) mod (C)。
         尼玛,我是傻逼啊,居然用x=C-1(C是质数)x=C(C是合数)!!!!!!!!!简单的数论啊,这个就给跪了!!

诡异的地方了我一直TLE啊,后的都优化了嘛,100W啊,怎么还是TLE啊?WA我都能接受,然后就去x=phi(C)啊。我擦擦擦!!!!


取x=phi(C);啊啊啊 啊
#include<stdio.h>
#include
<string.h>
#include
<math.h>
#define maxn 1000000
char B[maxn+5];
long long phi(long long  n)
{
    
long long ans=1,i;
    
for(i=2;i*i<=n;i++)
    {
        
if(n%i==0)
        {
            n
/=i;
            ans
*=i-1;
            
while(n%i==0)
            {
                n
/=i;
                ans
*=i;
            }
        }
    }
    
if(n>1)
    ans
*=n-1;
    
return ans;
}
long long strmod(long long t)
{
    
int i,len;
    
long long r=0;
    len
=strlen(B);
    
for (i=0;i<len;i++)
    {
        r
=(r*10+B[i]-'0'% t;
    }
    
return r;
}
long long power(long long a,long long b,long long c)
{
    
long long r;
    r
=1;a=a%c;
    
while (b)
    {
        
if (b&1)
            r
=(r*a) % c;
        a
=(a*a)%c;
        b
>>=1;
    }
    
return r % c;
}
int main()
{
    
long long A,b,C;
    
while (scanf("%I64d%s%I64d",&A,&B,&C)==3)
    {
        
long long t;
        A
=A%C;
        t
=phi(C);
        b
=strmod(t);
        printf(
"%I64d\n",power(A,b,C));
    }
    
return 0;
}

尼玛,我真心是傻逼啊!!!

posted on 2012-07-12 12:36 wangs 阅读(282) 评论(0)  编辑 收藏 引用 所属分类: ACM-数学


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