多校 6 (8/8) 我寫的題的題解

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;
}
相關文章
相關標籤/搜索