• 10.11的一些题


    T1 loj 2589 Hankson的趣味题

    题目大意:

    给 a1 a2 b1 b2

    求有多少个n满足 gcd(a1,n)=a2 lcm(b1,n)=b2

    思路:

    枚举b2的所有因数x

    判断的时候判断x/a2与a1/a2是否互质 b2/x与b2/b1是否互质

    只有都满足的时候才满足 正确性显然

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstdlib>
     5 #include<cstring>
     6 #include<algorithm>
     7 #include<vector>
     8 #include<queue>
     9 #define inf 2139062143
    10 #define ll long long
    11 #define MAXN 1200
    12 #define MOD 1000000000
    13 using namespace std;
    14 inline int read()
    15 {
    16     int x=0,f=1;char ch=getchar();
    17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    18     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    19     return x*f;
    20 }
    21 int T,a1,b1,a2,b2,ans,i;
    22 inline int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
    23 inline int solve(int x) {if(x%a2) return 0;return gcd(x/a2,a1/a2)==1&&gcd(b2/x,b2/b1)==1;}
    24 int main()
    25 {
    26     T=read();
    27     while(T--)
    28     {
    29         a1=read(),a2=read(),b1=read(),b2=read(),ans=0;
    30         for(i=1;i*i<=b2;i++)
    31             if(b2%i==0)    ans+=solve(i)+solve(b2/i);
    32         if((i-1)*(i-1)==b2) ans-=solve(i-1);
    33         printf("%d
    ",ans);
    34     }
    35 }
    View Code

    T2 bzoj 1876 SuperGCD

    题目大意:

    10000位高精度数求gcd

    思路:

    使用更相减损术+高精度

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cmath>
      4 #include<cstdlib>
      5 #include<cstring>
      6 #include<algorithm>
      7 #include<vector>
      8 #include<queue>
      9 #define inf 2139062143
     10 #define ll long long
     11 #define MAXN 1200
     12 #define MOD 1000000000
     13 using namespace std;
     14 inline int read()
     15 {
     16     int x=0,f=1;char ch=getchar();
     17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
     18     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
     19     return x*f;
     20 }
     21 struct bign
     22 {
     23     int len,val[MAXN];
     24     bign() {memset(val,0,sizeof(val));len=0;}
     25     void Print()
     26     {
     27         printf("%d",val[len]);
     28         for(int i=len-1;i>=0;i--)
     29             printf("%09d",val[i]);
     30     }
     31     bign operator + (const bign &a) const
     32     {
     33         bign ans;
     34         ans.len=max(len,a.len);
     35         for(int i=0;i<=ans.len;i++)
     36         {
     37             ans.val[i]+=val[i]+a.val[i];
     38             if(ans.val[i]>=MOD) {ans.val[i+1]++;ans.val[i]-=MOD;}
     39         }
     40         if(ans.val[ans.len+1]) ans.len++;
     41         return ans;
     42     }
     43     bign operator - (const bign &a) const
     44     {
     45         bign ans;
     46         ans.len=max(len,a.len);
     47         for(int i=0;i<=ans.len;i++)
     48         {
     49             ans.val[i]+=val[i]-a.val[i];
     50             if(ans.val[i]<0) {ans.val[i+1]--;ans.val[i]+=MOD;}
     51         }
     52         while(ans.val[ans.len]<=0&&ans.len) ans.len--;
     53         return ans;
     54     }
     55     bool operator < (const bign &a) const
     56     {
     57         if(len!=a.len) return len<a.len;
     58         for(int i=len;i>=0;i--)
     59             if(val[i]!=a.val[i]) return val[i]<a.val[i];
     60     }
     61     bool operator == (const bign &a) const
     62     {
     63         if(len!=a.len) return 0;
     64         for(int i=len;i>=0;i--)
     65             if(val[i]!=a.val[i]) return 0;
     66         return 1;
     67     }
     68 }a,b;
     69 int n,m,cnt;
     70 char s1[10010],s2[10010];
     71 inline bign div2(bign &x)
     72 {
     73     bign ans=x;int t;
     74     if(ans.val[ans.len]==1&&ans.len) ans.val[ans.len]=0,ans.val[--ans.len]+=MOD;
     75     else if(!ans.val[ans.len]) --ans.len;
     76     for(int i=ans.len;i>=0;i--)
     77     {
     78         if((ans.val[i]&1)&&i) ans.val[i-1]+=MOD;
     79         ans.val[i]>>=1;
     80     }
     81     //ans.Print();
     82     //puts("");
     83     return ans;
     84 }
     85 int main()
     86 {
     87     //freopen("gcd5.in","r",stdin);
     88     scanf("%s%s",s1+1,s2+1);
     89     n=strlen(s1+1),m=strlen(s2+1);
     90     for(int i=n,pw=1;i;i--)
     91     {
     92         if(pw==MOD) a.len++,pw=1;
     93         a.val[a.len]+=(s1[i]-'0')*pw,pw*=10;
     94     }
     95     for(int i=m,pw=1;i;i--)
     96     {
     97         if(pw==MOD) b.len++,pw=1;
     98         b.val[b.len]+=(s2[i]-'0')*pw,pw*=10;
     99     }
    100     //a.Print();puts("");b.Print();puts("");
    101     while((a.val[0]%2==0)&&(b.val[0]%2==0)) a=div2(a),b=div2(b),cnt++;
    102     while(a.val[0]%2==0) a=div2(a);while(b.val[0]%2==0) b=div2(b);
    103     while(!(a==b))
    104     {
    105         //a.Print();puts("");b.Print();puts("");
    106         if(a<b) b=b-a;else a=a-b;
    107         while(a.val[0]%2==0) a=div2(a);while(b.val[0]%2==0) b=div2(b);
    108     }
    109     while(cnt--) a=a+a;a.Print();
    110 }
    View Code

    T3 poj 3421 X-factor chain

    题目大意:

    给定x 求x的因子组成的满足任意前一项都能整除后一项的序列的最大长度以及最大长度的方案数

    思路:

    很容易发现最长的序列每一项相当于前一项乘以一个质因子

    所以分解质因数可以求出长度  方案数为长度的阶乘/各个质因子的指数的阶乘

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstdlib>
     5 #include<cstring>
     6 #include<algorithm>
     7 #include<vector>
     8 #include<queue>
     9 #define inf 2139062143
    10 #define ll long long
    11 #define MAXN 1200
    12 #define MOD 1000000000
    13 using namespace std;
    14 inline int read()
    15 {
    16     int x=0,f=1;char ch=getchar();
    17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    18     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    19     return x*f;
    20 }
    21 ll n,ans,k,res,c[35];
    22 int main()
    23 {
    24     for(int i=c[0]=1;i<=30;i++) c[i]=c[i-1]*i;
    25     while(scanf("%lld",&n)!=EOF)
    26     {
    27         ans=0,k=0,res=1;
    28         for(int i=2;i*i<=n;i++)
    29             if(n%i==0)
    30             {
    31                 while(n%i==0) {ans++,n/=i,k++;}
    32                 //cout<<i<<" "<<k<<" "<<n<<endl;
    33                 res*=c[k],k=0;
    34             }
    35         if(n>1) ans++;
    36         printf("%d %lld
    ",ans,c[ans]/res);
    37     }
    38 }
    View Code

    T4 bzoj 3629 聪明的燕姿

    题目大意:

    给定S 求有多少个数满足他们的因数之和为S 

    思路:

    对于一个正整数n被分解为p1^a1*p2^a2*...*pk^ak其约数和为(1+p1+p1^2+...+p1^a1)*(1+p2+p2^2+...+p2^a2)*...*(1+pk+pk^2+...+pk^ak)

    因此筛出素数后 我们可以搜索 i t s 表示搜到了第i个质数 要求的数乘到了t S被除到了s

    当s为1时 t即为所求

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstdlib>
     5 #include<cstring>
     6 #include<algorithm>
     7 #include<vector>
     8 #include<queue>
     9 #define inf 2139062143
    10 #define ll long long
    11 #define MAXN 100100
    12 using namespace std;
    13 inline int read()
    14 {
    15     int x=0,f=1;char ch=getchar();
    16     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    17     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    18     return x*f;
    19 }
    20 int n,t,ntp[MAXN+100],p[MAXN+100],tot;
    21 int a[MAXN];
    22 void mem()
    23 {
    24     ntp[0]=ntp[1]=1;
    25     for(int i=2;i<=MAXN;i++)
    26     {
    27         if(!ntp[i]) p[++tot]=i;
    28         for(int j=1;i*p[j]<=MAXN;j++)
    29         {
    30             ntp[i*p[j]]=1;
    31             if(i%p[j]==0) break;
    32         }
    33     }
    34 }
    35 int cheque(int x)
    36 {
    37     if(x<MAXN) return !ntp[x];
    38     for(int i=1;p[i]*p[i]<=x;i++) if(x%p[i]==0) return 0;
    39     return 1;
    40 }
    41  
    42 void dfs(int i,int u,int v)
    43 {
    44     //cout<<i<<" "<<u<<" "<<v<<" "<<t<<endl;
    45     if(v==1) a[++t]=u;
    46     else
    47     {
    48         if(v-1>p[i]&&cheque(v-1)) a[++t]=u*(v-1);
    49         //cout<<cheque(v-1)<<endl;
    50         for(int j=i+1;p[j]*p[j]<=v;j++)
    51             for(int t=p[j],s=t+1;s<=v;t*=p[j],s+=t) 
    52                 if(v%s==0) dfs(j,u*t,v/s);
    53     }
    54 }
    55 int main()
    56 {
    57     mem();
    58     while(scanf("%d",&n)!=EOF)
    59     {
    60         t=0;dfs(0,1,n);
    61         printf("%d
    ",t);sort(a+1,a+t+1);
    62         for(int i=1;i<=t;i++) {if(i<t)printf("%d ",a[i]);else printf("%d
    ",a[t]);}
    63     }
    64 }
    View Code
  • 相关阅读:
    条件概率融合
    径向函数,随机映射,SVM, 或者特征提取都是一类策略
    神经网络结构搜索
    NetCDF
    你应该看到更多
    Focal Loss for Dense Object Detection
    胶囊网络
    seq2seq模型
    编译lua解析器和lua动态库
    JavaScript Json数组的简单使用
  • 原文地址:https://www.cnblogs.com/yyc-jack-0920/p/9799836.html
Copyright © 2020-2023  润新知