给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘。如24:2*2=22(第一次乘),22*22=24(第二次乘),所以最少共2次;
分析:实际上那个指数是很大的,题目描述有问题。#include <iostream> #include <cmath> #include <cstdio> using namespace std; const int N=5e6+10; int p[N]; void init(){ p[1]=0; p[2]=1; for(int i=3;i<N;i++){ if(i&1) p[i]=p[i-1]+1; else p[i]=p[i/2]+1; } } int main() { init(); int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); printf("%d\n",p[n]); } return 0; }
19 | 20 | 1 | 2 | 3 |
18 | 21 | 22 | 5 | 4 |
17 | 16 | 23 | 6 | 7 |
14 | 15 | 24 | 25 | 8 |
13 | 12 | 11 | 10 | 9 |
16 | 1 | 2 | 3 |
15 | 14 | 13 | 4 |
10 | 11 | 12 | 5 |
9 | 8 | 7 | 6 |
#include <iostream> #include <cstdio> using namespace std; typedef unsigned long long LL; int main() { LL n; while(cin>>n){ LL ans=(n-1)*n*n-(n-1)*(n-2)+(n*n-2*(n-2))/2; printf("%llu\n",ans); } return 0; }
#include <iostream> #include <cstdio> #include <cmath> using namespace std; const double eps=1e-7; int main() { int t,k; cin>>t; while(t--){ scanf("%d",&k); for(int y=k+1;y<=2*k;y++){ for(int x=y;;x++){ double p1=1.0/k; double p2=1.0/x+1.0/y; if(fabs(p1-p2)<eps) { printf("1/%d=1/%d+1/%d\n",k,x,y); } if(p1-p2>eps) break; } } } return 0; }
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
for(k=j+1;k<=n;k++)
operation;
你知道 operation 共执行了多少次吗
分析:规律题。i<j<k<……<#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef long long LL; const LL mod=1009,N=2005; LL pri[N],cnt; bool vis[N]; void getpri(){ for(LL i=2;i<N;i++){ if(!vis[i]) pri[cnt++]=i; for(LL j=0;j<cnt&&i*pri[j]<N;j++){ vis[i*pri[j]]=1; if(i%pri[j]==0) break; } } } LL getd(LL a,LL d){ LL ans=0; while(a){ a/=d; ans=ans+a; } return ans; } LL power(LL a,LL p){ LL ans=1; a=a%mod; while(p>0){ if(p&1) ans=ans*a%mod; a=a*a%mod; p>>=1; } return ans; } int main() { getpri(); LL n,m; while(cin>>m>>n&&(m+n)){ LL ans=1; for(LL i=0;pri[i]<=n;i++){ LL t1=getd(n,pri[i]),t2=getd(n-m,pri[i]),t3=getd(m,pri[i]); ans=ans*power(pri[i],t1-t2-t3)%mod; } printf("%d\n",ans); } return 0; }
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int mod=1009,N=2005; int dp[N][N]; void init(){ for(int i=0;i<N;i++){ dp[i][0]=dp[i][i]=1; } for(int i=2;i<N;i++){ for(int j=1;j<i;j++){ dp[i][j]=(dp[i-1][j-1]+dp[i-1][j])%mod; } } } int main() { init(); int n,m; while(cin>>m>>n&&(m+n)){ printf("%d\n",dp[n][m]); } return 0; }