P1017 进制转换 发表于 2019-07-26 | 评论数: 负进制转换结论题,如果出现负数的余数那么设n m r为转换数进制和余数 那么 r-=m,n+=m就行了其他都一样 12345678910111213141516171819202122232425#include <bits/stdc++.h>using namespace std;void change(int n,int m){ if(n==0) return; int r=n%m; if(r<0) r-=m,n+=m; change(n/m,m); char c; if(r>=10) c=r-10+'A'; else c=r+'0'; printf("%c",c);}int main(){ int n,m; scanf("%d%d",&n,&m); printf("%d=",n); change(n,m); printf("(base%d)",m);}
矩阵快速幂模板 发表于 2019-07-26 | 评论数: 解决大斐波那契数问题,我线代没学所以不是很理解这玩意,只好先记住以下板子了 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657#include <iostream>#include <cstdio>using namespace std;struct node{ long long a[3][3];};node mul(node a,node b){ node c; for(int i=1;i<=2;i++) for(int j=1;j<=2;j++) { c.a[i][j]=0; for(int k=1;k<=2;k++) c.a[i][j]+=(a.a[i][k]*b.a[k][j]); c.a[i][j]%=1000000007; } return c;}node qp(node a,int b){ node ans; ans.a[1][1]=ans.a[1][2]=ans.a[2][1]=1; ans.a[2][2]=0; while(b) { if(b&1) ans=mul(ans,a); a=mul(a,a); b>>=1; } return ans;}int main(){ int n,t; scanf("%d",&t); while(t--) { scanf("%d",&n); if(n==-1) break; node now; now.a[1][1]=now.a[1][2]=now.a[2][1]=1; now.a[2][2]=0; if(n==0) { printf("0\n"); continue; } if(n<=2&&n>0) printf("1\n"); else printf("%d\n",qp(now,n-2).a[1][1]); }}
POJ-1845 Sumdiv (基础数论综合) 发表于 2019-07-24 | 评论数: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#include <iostream>#include <cstdio>#include <cstring>using namespace std;typedef long long ll;const ll mod=9901;ll p,bk[5005],sum[5005],q[5005];void fj(ll x){ p=0; memset(sum,0,sizeof(sum)); for(int i=2;i*i<=x+1;i++) { if(x%i==0) { q[++p]=i; while(x%i==0) sum[p]++,x/=i; } } if(x>1) q[++p]=x,sum[p]=1;}ll qpow(ll a,ll b){ ll ans=1; ll base=a; while(b) { if(b&1) ans=ans%mod*base%mod,ans%=mod; base=base%mod*base%mod,base%=mod; b>>=1; } return ans%mod;}ll getsum(ll a,ll b){ if(b==0) return 1; if(b%2==1) //奇数式 return ((1+qpow(a,(b+1)/2))*getsum(a,(b-1)/2)%mod)%mod; if(b%2==0) //偶数式 return ((1+qpow(a,b/2))*getsum(a,(b/2)-1)%mod+qpow(a,b))%mod;}int main(){ ll n,m,ans=0; while(~scanf("%lld%lld",&n,&m)) { fj(n); ans=1; for(int i=1;i<=p;i++) { ans=ans%mod*(getsum(q[i],sum[i]*m))%mod; ans%=mod; } printf("%lld\n",ans%mod); }}
POJ1061 青蛙的约会(拓展欧几里得) 发表于 2019-07-22 | 更新于 2019-08-09 | 评论数: 19/08/09 更新注意一下如果a的值小于0的话需要两边同时乘以-1这样保证两边都是正数顺便更新一下代码123456789101112131415161718192021222324252627282930313233343536#include <cstdio>#include <cmath>using namespace std;typedef long long ll;void gcd(ll a,ll b,ll& x,ll& y,ll& d){ if(!b) x=1,y=0,d=a; else gcd(b,a%b,y,x,d),y-=a/b*x;}int main(){ ll x,y,n,m,l; while(~scanf("%lld%lld%lld%lld%lld",&x,&y,&n,&m,&l)) { ll a=m-n; ll b=l; ll c=(x-y); ll xx,yy,d; if(a<0) { a=-a; c=-c; } gcd(a,b,xx,yy,d); if(c%d) printf("Impossible\n"); else { xx*=c/d; b/=d; printf("%lld\n",(xx%b+b)%b); } }}