poj 1845
来源:互联网 发布:java网上商城源码下载 编辑:程序博客网 时间:2024/05/22 01:47
题目:求出A^B的因子和modp的值
思路:利用sigma函数计算即可。sum=(p1^(k1*B+1)-1)/(p1-1)*...
然后就是将/(p1-1)转化成逆元去计算 就可以避免/运算。
但是这边有一个问题是 如果p|p1-1 那么逆元无解。wa情况。
思路:利用sigma函数计算即可。sum=(p1^(k1*B+1)-1)/(p1-1)*...
然后就是将/(p1-1)转化成逆元去计算 就可以避免/运算。
但是这边有一个问题是 如果p|p1-1 那么逆元无解。wa情况。
也就只能另外计算了。p1=k*p+1 因为对于乘法同余,所以值为(k1*B+1)
#include <stdio.h>#include <stdlib.h>#include <iostream>#include <math.h>#include <algorithm>using namespace std;typedef long long ll;const int maxn=50000;const int mod=9901;bool vis[maxn];int prime[maxn],len=0;void pri(){ for(int i=2;i<maxn;i++) { if(!vis[i]) prime[len++]=i; for(int j=0;j<len&&i*prime[j]<maxn;j++) { vis[i*prime[j]]=1; if(i%prime[j]==0) break; } }}ll extend_gcd(ll a,ll b,ll &x,ll &y){ if(a==0&&b==0) return -1;//无最大公约数 if(b==0){x=1;y=0;return a;} ll d=extend_gcd(b,a%b,y,x); y-=a/b*x; return d;}ll mod_reverse(ll a,ll n){ ll x,y; ll d=extend_gcd(a,n,x,y); if(d==1) return (x%n+n)%n; else return -1;}ll pow_mod(ll a,ll b){ ll ans=1; while(b) { if(b&1) ans=(ans*a)%mod; a=a*a%mod; b>>=1; } return ans%mod;}int main(){ //freopen("in.txt","r",stdin); pri(); int n,b; while(scanf("%d%d",&n,&b)!=EOF) { //cout<<n<<" "<<b<<endl; if(n==0){printf("%d\n",n);continue;} if(n==1||b==0){printf("1\n");continue;} int en=sqrt(n+0.5),ans=1; for(int i=0;i<len&&prime[i]<=n;i++) { int temcou=0,temans=1; if(n%prime[i]==0) { //printf("%d->",prime[i]); int k=prime[i]%mod; while(n%prime[i]==0) {n/=prime[i];temcou++;temans=temans*k%mod;} if(k!=1) {ll subans=((pow_mod(temans,b)*k)%mod-1+mod)%mod;///p^(k1*b+1) ll b_reverse=mod_reverse(prime[i]-1,mod); // printf("subans: %I64d b_reverse:%I64d\n",subans,b_reverse); ans*=subans*b_reverse%mod; } else ans*=temcou*b+1; ans%=mod; } } if(n>1) { int k=n%mod; //printf("----%d\n",k); if(k!=1) {ll subans=((pow_mod(k,b)*k)%mod-1+mod)%mod;///p^(b+1) ll b_reverse=mod_reverse(n-1,mod);///n-1和mod是倍数 ans*=subans*b_reverse%mod;} else ans*=(b+1)%mod; ans%=mod; } printf("%d\n",ans%mod); } return 0;}
0 0
- POJ 1845
- poj 1845
- POJ 1845
- poj 1845
- POJ 1845
- poj 1845
- POJ 1845
- poj 1845
- poj 1845
- poj 1845
- POJ 1845
- Poj - 1845
- poj 1845
- POJ 1845
- POJ 1845 Sumdiv
- poj 1845-Sumdiv
- poj 1845 Sumdiv
- poj 1845 Sumdiv
- HDUOJ_1196(二进制-十进制)
- HDOJ 1284 钱币兑换问题(完全背包)
- 来报到啦
- android canvas onDraw和Draw的bitmap区别
- 字符串参与运算
- poj 1845
- 后缀数组学习笔记
- linux和openwrt下更新源
- 命名规则
- 使用 XMLNS:APP 出现 ERROR 的问题
- Resources (library) in JSF 2.0
- 输入3个字符串,按字符串由短到长的顺序输出
- c递归实现 汉诺塔
- UVA 题目1223 - Editor(后缀数组求出现次数超过两次的最长子串的长度)