2 条题解

  • 1
    @ 2023-10-30 10:58:45
    #include<bits/stdc++.h>
    using namespace std;
    const int N=110;
    struct node{
    	int len,a[N];
    	node(){
    		len=1;
    		memset(a,0,sizeof(a));
    	}
    };
    node operator +(node n1,node n2){
    	node ans;
    	ans.len=n1.len;
    	for(int i=1;i<=ans.len;i++){
    		ans.a[i]=n1.a[i]+n2.a[i];
    	}
    	for(int i=1;i<=ans.len;i++){
    		ans.a[i+1]+=ans.a[i]/10;
    		ans.a[i]%=10;
    	}
    	int i=ans.len;
    	while(ans.a[i+1]>0){
    		i++;
    		ans.a[i+1]+=ans.a[i]/10;
    		ans.a[i]%=10;
    	}
    	while(!ans.a[i]&&i>1)i--;
    	ans.len=i;
    	return ans;
    }
    node operator -(node n1,int x){
    	node ans=n1;
    	ans.a[1]=ans.a[1]-x;
    	for(int i=1;i<=ans.len;i++){
    		if(ans.a[i]<0){
    			ans.a[i+1]--;
    			ans.a[i]+=10;
    		}
    	}
    	int i=ans.len;
    	while(!ans.a[i]&&i>1)i--;
    	return ans;
    }
    node operator *(node n1,node n2){
    	node ans;
    	ans.len=n1.len+n2.len-1;
    	for(int i=1;i<=n1.len;i++)
    		for(int j=1;j<=n2.len;j++)
    			ans.a[i+j-1]+=n1.a[i]*n2.a[j];
    	for(int i=1;i<=ans.len;i++){
    		ans.a[i+1]+=ans.a[i]/10;
    		ans.a[i]%=10;
    	}
    	int i=ans.len;
    	while(ans.a[i+1]>0){
    		i++;
    		ans.a[i+1]+=ans.a[i]/10;
    		ans.a[i]%=10;
    	}
    	while(!ans.a[i]&&i>1)i--;
    	ans.len=i;
    	return ans;
    }
    node f[N],g[N];
    int main(){
    	int n;scanf("%d",&n);
    	g[1].a[1]=1,g[2].a[1]=3;
    	f[1].a[1]=1,f[2].a[1]=5;
    	for(int i=3;i<=n;i++){
    		g[i]=g[i-1]+g[i-2];
    		if(i%2==1){
    			f[i]=g[i]*g[i];
    		}
    		if(i%2==0){
    			f[i]=g[i]*g[i];
    			f[i]=f[i]-4;
    		}
    	}
    	for(int i=f[n].len;i>=1;i--){
    		printf("%d",f[n].a[i]);
    	}
    	return 0;
    }
    
    • 0
      @ 2023-8-25 18:17:53
      #include<cstdio>
      #include<cstring>
      #include<iostream>
      using namespace std;
      const int tt=10000;
      int n;
      struct xcw
      {
          int len,a[1005];
          xcw(){memset(a,0,sizeof(a));len=0;}
          xcw(int x)
      	{
              memset(a,0,sizeof(a));len=0;
              do{a[++len]=x%tt;x/=tt;}while(x);
          }
          xcw operator *(const int b)const
      	{
              xcw c;
              c.len=len;
              for(int i=1;i<=len;i++){
                  c.a[i]+=a[i]*b;
                  c.a[i+1]+=c.a[i]/tt;
                  c.a[i]%=tt;
              }
              if(c.a[c.len+1]) c.len++;
              return c;
          }
          xcw operator -(const xcw b)const
      	{
              xcw c;
              c.len=max(len,b.len);
              for(int i=1;i<=c.len;i++)
      		{
                  c.a[i]+=a[i]-b.a[i]+tt;
                  c.a[i+1]+=c.a[i]/tt-1;
                  c.a[i]%=tt;
              }
              while(!c.a[c.len]) c.len--;
              return c;
          }
          xcw operator +(const int b)const
      	{
              xcw c;
              c.len=len;c.a[1]+=b;
              for(int i=1;i<=c.len;i++)
      		{
                  c.a[i]+=a[i];
                  c.a[i+1]+=c.a[i]/tt;
                  c.a[i]%=tt;
              }
              if(c.a[c.len+1]) c.len++;
              return c;
          }
          void write()
      	{
              printf("%d",a[len]);
              for(int i=len-1;i;i--) printf("%04d",a[i]);
              printf("\n");
          }
      }f[105];
      int main()
      {
          scanf("%d",&n);
          f[1]=1;f[2]=5;
          for(int i=3;i<=n;i++) f[i]=f[i-1]*3-f[i-2]+2;
          f[n].write();
          return 0;
      }
      
      • 1

      信息

      ID
      1002
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      递交数
      142
      已通过
      59
      上传者