1001ios
大力猜結論spa
積出2*b,後面積不出來了blog
猜a*pi過掉了input
罰時6次數學
大概就是string
printf("%.6lf\n",2*b+a*pi-5e-7);
這樣的代碼it
我討厭這種題.....io
1002class
數學題stream
猜結論1:gcd(2x-1,2y-1)=2gcd(x,y)-1
猜結論2:gcd(F(x),F(y))=F(gcd(x,y))
而後容斥,求出答案
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<time.h> #include<math.h> #include<memory> #include<vector> #include<bitset> #include<fstream> #include<stdio.h> #include<utility> #include<sstream> #include<string.h> #include<iostream> #include<stdlib.h> #include<algorithm> using namespace std; int fact[20000005]; int anti_fact[20000005]; const int modo=1000000007; int power(int x,int y) { if (y==0) return 1; int t=power(x,y/2); t=(long long)t*t%modo; if (y%2==1) { t=(long long)t*x%modo; } return t; } int c(int n,int m) { return (long long)fact[n]*anti_fact[m]%modo*anti_fact[n-m]%modo; } int f[1000005]; int ans[1000005]; int main() { int i; fact[0]=1; for (i=1;i<=2000000;i++) { fact[i]=(long long)fact[i-1]*i%modo; } anti_fact[2000000]=power(fact[2000000],modo-2); for (i=2000000;i>=1;i--) { anti_fact[i-1]=(long long)anti_fact[i]*i%modo; } f[1]=1; for (i=2;i<=1000000;i++) { f[i]=f[i-1]+f[i-2]; f[i]%=(modo-1); } int zu; int t; scanf("%d",&t); for (zu=0;zu<t;zu++) { int n,k; scanf("%d%d",&k,&n); int i; for (i=1;i<=k;i++) { if (k%i==0) { ans[i]=c(n+(k/i)-1,k/i); } else { ans[i]=0; } } for (i=k;i>=1;i--) { if (ans[i]!=0) { int j; for (j=i+i;j<=k;j+=i) { ans[i]-=ans[j]; if (ans[i]<0) ans[i]+=modo; } } } int sum=0; for (i=1;i<=k;i++) { //printf("%d %d\n",i,ans[i]); if (ans[i]!=0) { sum=(sum+(long long)ans[i]*(power(2,f[i])-1))%modo; } } sum=(long long)sum*power(c(n+k-1,k),modo-2)%modo; printf("%d\n",sum); } return 0; }
1009
村子裏面可能全是狼,它們說的話是真是假無所謂
因此不可能有鐵村民
接下來考慮鐵狼,若是某我的是民必定會致使矛盾那麼他就是狼
若是某我的是民,他說的必定是真話,那麼若是他說別人是民,那我的確定也說了真話
這樣下去
咱們能夠獲得一個鏈
這個鏈上的全部人都是民
若是鏈到一個已經訪問過的人,他是鐵狼,那麼這一些人都是鐵狼
若是鏈變成了環(互認爲民),那麼這些人必定不是鐵狼,由於這個環能夠成立
若是鏈到一個能夠是民的人,那麼看這個民鏈到最後指的狼是誰
若是沒指(互認民的狀況),那麼就不是鐵狼
若是指的到人,那麼看這我的是否在環內
不在的話,就全能夠是民,也就是不存在鐵狼
若是存在的話,這我的是鐵狼,全部認這我的是民的所有是鐵狼
別的依舊是民
大概就討論這麼多了................
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<time.h> #include<math.h> #include<memory> #include<vector> #include<bitset> #include<fstream> #include<stdio.h> #include<utility> #include<sstream> #include<string.h> #include<iostream> #include<stdlib.h> #include<algorithm> using namespace std; #define next s2i39 #define tpye d923l char a[10005]; int next[1000005]; bool type[1000005]; int ans[100005]; bool vis[100005]; int main() { #ifdef absi2011 freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int t; scanf("%d",&t); int zu; for (zu=0;zu<t;zu++) { int n; scanf("%d",&n); int i; for (i=0;i<n;i++) { int x; scanf("%d%s",&x,a); next[i]=x-1; if (a[0]=='w') { type[i]=1; } else { type[i]=0; } ans[i]=-1; vis[i]=false; } int sum=0; for (i=0;i<n;i++) { if (ans[i]!=-1) { continue; } if (type[i]==1) { sum++; ans[i]=1; continue; } int now; for (now=i;;now=next[now]) { if (vis[now]) { break; } if (ans[now]==0) { break; } if (type[now]==1) { break; } vis[now]=true; } if (ans[now]==0) { int temp; for (temp=i;temp!=now;temp=next[temp]) { ans[temp]=0; } } else if (type[now]==0) { int temp; for (temp=i;ans[temp]!=1;temp=next[temp]) { ans[temp]=1; sum++; } } else if (type[now]==1) { int temp; for (temp=i;temp!=now;temp=next[temp]) { if (temp==next[now]) { break; } } if (temp==now) { //All OK for (temp=i;temp!=now;) { ans[temp]=1; sum++; int ttemp=next[temp]; type[temp]=1; next[temp]=next[now]; temp=ttemp; } } else { for (temp=next[temp];temp!=now;) { ans[temp]=1; sum++; int ttemp=next[temp]; type[temp]=1; next[temp]=next[now]; temp=ttemp; } for (temp=i;temp!=now;temp=next[temp]) { ans[temp]=0; if (temp==next[now]) { break; } } } } } printf("0 %d\n",n-sum); } return 0; }
1011
又是個數學題......有點報警
講道理別這麼折磨我..讓我寫那麼多數學題..........
首先題目裏面的那個矩陣是
若是c(i,j) mod p = 0那麼就是0,不然是1
那麼先考慮n=1
那個矩陣的1次方,咱們觀察下
發現是長成這樣的
1 0 .. 0
1 1 .. 0
..........
1 1 .. 1
這樣的對角矩陣,那麼咱們k+1次方之後
我驚訝的發現,它是
C(k,k) 0 .. 0
C(k+1,k) C(k,k) .. 0
..................................
C(k+p-1,k) C(k+p-2,k) ..... C(k,k)
它們的和是
C(k+p+1,k+2)
也就是這個對角矩陣的k次方的和是
C(k+p,k+1)
那麼咱們考慮一下
根據Lucas定理,C(n,k) % p = C(n%p,k%p) * C(n/p,k/p) % p
那麼整個矩陣就像分形同樣這樣分下來
因此對於pn*pn的矩陣而言,和是C(k+p,k+1)n
那麼事情簡單了,根據高中數學
x + x2 + x3 + .... + xn = x(xn-1)/(x-1)
因此咱們只要快速求C就好了
咱們枚舉k,每次C根據上一次C來求
C(k+p,k+1) = (k+p)! / (k+1)! / (p-1)!
因此每次咱們k增長了,求乘k+p再除以k+1就好
綜上能夠求出答案
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<time.h> #include<math.h> #include<memory> #include<vector> #include<bitset> #include<fstream> #include<stdio.h> #include<utility> #include<sstream> #include<string.h> #include<iostream> #include<stdlib.h> #include<algorithm> using namespace std; const int modo=1000000007; int power(int x,int y) { if (y==0) return 1; int t=power(x,y/2); t=(long long)t*t%modo; if (y%2==1) { t=(long long)t*x%modo; } return t; } int anti_fact[200005]; bool not_prime[2000005]; int prime[200005]; int main() { int t; scanf("%d",&t); int n,cc,k; int i; int cnt=0; for (i=2;i<=2000000;i++) { if (!not_prime[i]) { prime[cnt++]=i; int j; if (i>=10000) continue; for (j=i*i;j<=2000000;j+=i) { not_prime[j]=true; } } } for (i=1;i<=200000;i++) { anti_fact[i]=power(i,modo-2); } for (i=0;i<t;i++) { scanf("%d%d%d",&cc,&n,&k); if ((n>1000000000)||(cc>100000)||(k>100000)||(cc<0)||(k<0)||(n<0)) { for(;;); } int p=prime[cc-1]; int sum=0; int j; int p1=p; int p2=(long long)(n+1)*n/2%modo; for (j=1;j<=k;j++) { p1=(long long)p1*(j+p)%modo*anti_fact[j+1]%modo; if (p1==1) { sum=(sum+(long long)p1*n%modo)%modo; } else { sum=(sum+(long long)p1*(power(p1,n)-1)%modo*power(p1-1,modo-2)%modo)%modo; } } printf("%d\n",sum); } return 0; }