BZOJ 1004: [HNOI2008]Cards(群论)

好吧我就是蒟蒻根本没听说过群论虽说听叉姐说几万年都不会考

我也讲不太来,直接戳VFK大神的blog啦 = = http://vfleaking.blog.163.com/blog/static/17480763420119685112649/

 然后在加上2001年的论文Pólya原理及其应用 应该能做了吧= =

反正数论题就是各种小心

CODE:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 10000
struct bigint{
 int len,a[maxn];
 int init(int x){memset(a,0,sizeof(a));a[len=1]=x;}
 int print(){
  for (int i=len;i>=1;i--) printf("%d",a[i]);
  return 0;
 }
}f[103];
bigint operator + (const bigint &x,bigint &y) {
 bigint ans;
 ans.init(0);
 ans.len=max(x.len,y.len);
 for (int i=1;i<=ans.len;i++) {
  ans.a[i]=x.a[i]+y.a[i]+ans.a[i-1]/10;
  ans.a[i-1]%=10;
 }
 if (ans.a[ans.len]/10) {
  ans.a[++ans.len]=1;
  ans.a[ans.len-1]%=10;
 }
 return ans;
}
bigint operator - (const bigint &x,bigint &y) {
 bigint ans;
 ans.init(0);
 ans.len=max(x.len,y.len);
 for (int i=1;i<=ans.len;i++) {
  ans.a[i]=x.a[i]-y.a[i];
  if (ans.a[i-1]<0) {ans.a[i-1]+=10;ans.a[i]--;}
 }
 while (!ans.a[ans.len]) ans.len--;
 return ans;
}
bigint operator * (const bigint &x,int y){
 bigint ans;
 ans.init(0);
 ans.len=x.len;
 for (int i=1;i<=ans.len;i++) {
  ans.a[i]=x.a[i]*y +ans.a[i-1]/10;
  ans.a[i-1]%=10;
 }
 if (ans.a[ans.len]/10) {
  ans.a[ans.len+1]=ans.a[ans.len]/10;
  ans.a[ans.len++]%=10;
 }
 return ans;
}
int main(){
 int n;
 scanf("%d",&n);
 f[1].init(1);f[2].init(5);
 f[0].init(2);
 for (int i=3;i<=n;i++) f[i]=f[i-1]*3-f[i-2]+f[0];
 f[n].print();
 return 0;
}

posted @ 2014-07-29 22:22  New_Godess  阅读(115)  评论(0编辑  收藏  举报