ACdream 速攻组~

1007 a + b

 1 /*这题就是一个快速幂,但是十分猥琐的是,模是1e10 + 7,不是1e9 + 7,这就产生了一个爆long long的问题。所以要对快速幂中的乘法操作进行一下改造。请教了BIT_Is_a_Tree,学会了传说中的 「快速加」。原理和快速幂一模一样,a^{b}是b个a相乘,a \times b就是b个a相加。缺点是多了\log{n} 的复杂度。

 2 */

 3 using namespace std;

 4 typedef long long ll;

 5 #define MOD 10000000007LL

 6 ll fMul(ll a, ll b) {

 7     ll t = 0, y = a;

 8     while(b) {

 9         if(b & 1) t = (t + y) % MOD;

10         y = (y + y) % MOD;

11         b >>= 1;

12     }

13     return t;

14 }

15 ll modExp(ll a, ll b) {

16     ll t = 1, y = a;

17     while(b) {

18         if(b & 1) t = (fMul(t, y)) % MOD;

19         y = (fMul(y, y)) % MOD;

20         b >>= 1;

21     }

22     return t;

23 }

24 int main() {

25     int T;

26     ll n, k, t, sum;

27     cin >> T;

28     while(T--) {

29         cin >> n >> k;

30         sum = 0;

31         for(int i = 1; i <= n; i++) {

32             cin >> t;

33             t = ((t % MOD) + MOD) % MOD;

34             sum += modExp(t, k);

35             sum %= MOD;

36         }

37         cout << sum << endl;

38     }

39     return 0;

40 }
View Code

1008 A Very Easy Triangle Counting Game

 1 /*题意:在圆上取n个点,相邻两个点之间连线,(注意,n和1相邻),然后所有点对(i ,i+2)相连,问能形成的不同的三角形有多少个?

 2 

 3 思路:画图找规律,发现n=3,cnt=1;  n=4,cnt=8; n=5 cnt=35  (5*2+5*2+ 5+5+5); n=6 cnt= 32 (6*2+6*2+ 6+2);

 4 

 5         n=7,cnt=35(7*2+7*2+7); n=8, cnt=40(8*2+8*2+8) 发现后面项演变成多边形了!

 6 

 7      于是得到规律:n>6;cnt=5*n

 8 */

 9 #include <stdio.h>  

10     int a[7]={0,0,0,1,8,35,32};  

11     int main()  

12     {  

13         int T,n,ans;  

14         scanf("%d",&T);  

15         for(int i=1;i<=T;i++)  

16         {  

17             scanf("%d",&n);  

18             ans=n>6?(5*n):a[n];  

19             printf("Case #%d: %d\n",i,ans%20121111);  

20         }  

21         return 0;  

22     }
View Code

1013 Count It!

 1 /*

 2 扫一遍,胡乱暴力一发~

 3 */

 4 #include<iostream>

 5 #include<string.h>

 6 #include<stdio.h>

 7 #include<ctype.h>

 8 #include<algorithm>

 9 #include<stack>

10 #include<queue>

11 #include<set>

12 #include<math.h>

13 #include<vector>

14 #include<map>

15 #include<deque>

16 #include<list>

17 using namespace std;

18 int main()

19 {

20     int a;

21     while(cin>>a)

22     {

23         string b;

24         cin>>b;

25         int minn=0;

26         for(int i=0;i<b.size();i++)

27             {

28                 if(b[i]=='L')

29                     minn++;

30             }

31         cout<<minn+a-b.size()<<" "<<minn<<endl;

32     }

33     return 0;

34 }
View Code

1020 The Game about KILL

 1   /*

 2 约瑟夫环,n太大,首先可以想到打表找看有没有规律

 3 

 4 可以发现时有规律的

 5 

 6 可以看到,只要是2的i次幂,那么存活的是1,后面的依次加2

 7 

 8 例如4为1,5就是3,6->5,7->7,8->1

 9 --------------------------------------------------------

10 我直接拍log(n)/log(2),使劲wa,唉唉唉,姿势长傻了,没办法

11 */

12  #include <stdio.h>  

13     #include <string.h>  

14     #include <algorithm>  

15     using namespace std;  

16     #define ll long long  

17     ll f[50],n;  

18        

19     int main()  

20     {  

21         int i;  

22         f[0] = 1;  

23         for(i = 1; i<31; i++)  

24             f[i] = f[i-1]*2;  

25         while(~scanf("%lld",&n))  

26         {  

27             for(i = 1; i<31; i++)  

28             {  

29                 if(n<f[i])  

30                     break;  

31             }  

32             printf("%lld\n",1+2*(n-f[i-1]));  

33         }  

34        

35         return 0;  

36     }  
View Code

1037 UUZ is hunger

 1 /*

 2 sort一下,然后累加暴力一发~

 3 */

 4 #include<iostream>

 5 #include<string.h>

 6 #include<stdio.h>

 7 #include<ctype.h>

 8 #include<algorithm>

 9 #include<stack>

10 #include<queue>

11 #include<set>

12 #include<math.h>

13 #include<vector>

14 #include<map>

15 #include<deque>

16 #include<list>

17 using namespace std;

18 long long a[100010];

19 int main()

20 {

21     long long n,k;

22     while(scanf("%lld%lld",&n,&k)!=EOF)

23     {

24         memset(a,0,sizeof(a));

25         long long sum=0;

26         int ans=0;

27         for(int i=0;i<n;i++)

28             cin>>a[i];

29         sort(a,a+n);

30         for(int i=n-1;i>=0;i--)

31         {

32             sum+=a[i];

33             ans++;

34             if(sum>=k)

35                 break;

36         }

37         cout<<ans<<endl;

38     }

39     return 0;

40 }
View Code

1061 郭式树

 1 /*

 2 啪啪啪,叫你别用cin,叫你别用cout,叫你沙茶

 3 */

 4     #include <stdio.h>  

 5     #include <string.h>  

 6     #include <algorithm>  

 7     using namespace std;  

 8        

 9     int main()  

10     {  

11         int t;  

12         long long x, y;  

13         unsigned long long z;  

14         scanf("%d", &t);  

15         while(t--)  

16         {  

17             scanf("%lld%lld", &x, &y);  

18             if(x > y)  

19                 z = x - y;  

20             else  

21                 z = y - x;  

22             printf("%llu\n", z);  

23         }  

24         return 0;  

25     }  
View Code

1064 完美数

 1   /*

 2 数位DP,乱搞一发

 3 s=0表示既不含3也不含8

 4 s=1表示只含3

 5 s=2表示只含8

 6 s=3表示既含3也含8

 7 */

 8 #include<cstdio>  

 9     #include<cstring>  

10     int a[10],f[10][4];  

11     int new_s(int s,int d){  

12         if(d==3)return s|1;  

13         if(d==8)return s|2;  

14         return s;  

15     }  

16     int dfs(int i,int s,bool e){  

17         if(i==-1)return s==1||s==2;  

18         if(!e&&f[i][s]!=-1)return f[i][s];  

19         int res=0,u=e?a[i]:9,d;  

20         for(d=0;d<=u;d++)res+=dfs(i-1,new_s(s,d),e&&(d==u));  

21         return e?res:f[i][s]=res;  

22     }  

23     int cal(int n){  

24         int i=0;  

25         while(n){a[i++]=n%10,n/=10;}  

26         return dfs(i-1,0,1);  

27     }  

28     int main(){  

29         int T,l,r;  

30         scanf("%d",&T);  

31         memset(f,-1,sizeof(f));  

32         while(T--){  

33             scanf("%d%d",&l,&r);  

34             printf("%d\n",cal(r)-cal(l-1));  

35         }  

36         return 0;  

37     } 
View Code

1065 同心树

 1 /*

 2 几何题目,乱搞就是

 3 */

 4 #include<iostream>

 5 #include<stdio.h>

 6 #include<cstring>

 7 #include<algorithm>

 8 #include<cmath>

 9 using namespace std;

10 int main( )

11 {

12     int T;

13     double N,a;

14     scanf("%d",&T);

15     while( T-- ){

16     scanf("%lf%lf",&N,&a);

17     if( a >= 90 )

18         a -= 90;

19     if( a == 0 )

20     {

21         printf("%.2lf\n",N*N);

22         continue;

23     }

24     a = a*3.141592654/180.0;

25     double r = N/( 1 + cos(a) + sin(a) );

26     printf("%.2lf\n",N*N-r*r*(sin(2*a)));

27     }

28     return 0;

29 }
View Code

1069 无耻的出题人

 1 /*题意:翻译题目之后,再解决翻译之后的题目

 2 思路:斐布拉契数,注意规律,

 3 翻译代码如下:

 4 #include<stdio.h>

 5 #include<cstring>

 6 char s[28]={'0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

 7 int main()

 8 {

 9   long long a[100];

10   a[0]=1;a[1]=1;

11   for(int i=2;i<100;i++)

12     a[i]=a[i-1]+a[i-2];

13   char c[100];

14   gets(c);

15   for(int i=0,x=0;i<strlen(c);)

16     {

17      for(int j=1;j<=26;j++)

18      {

19        if(c[i]==s[j])

20        {

21          c[i]=s[(j-a[x]%26+26)%26];//题目的26个字母是循环的

22          i++;x++;

23          break; 

24        }

25        else if(c[i]==' '||c[i]==',')

26        {

27              i++;   

28        }

29      }

30     }

31   printf("%s",c);

32   //puts(c);

33 }

34 A题代码如下:

35 */

36 #include <stdio.h>

37 #include <string.h>

38 int main()

39 {

40   char s[100];

41   while(scanf("%s",s)!=EOF)

42   {

43     int sum=0;

44     for(int i=0;s[i];i++)

45     {

46       if(s[i]>='0' && s[i] <='9')

47         sum+=s[i]-'0';

48     }

49     printf("%d\n",sum);

50   }

51 }
View Code

1088 哼!我才是最短的

 1 /*

 2 输出的时候,按照8 1 7 2 6 3 5 4这种一大一小输出即可

 3 */

 4     #include<iostream>  

 5     #include<cstdio>  

 6     using namespace std;  

 7     #define M 1000005  

 8     #define MN 100000  

 9     int main()  

10     {  

11         int n,a;  

12         int i,j;  

13         cin>>n;  

14         while(n--)  

15         {  

16             cin>>a;  

17             if(a%2==0)  

18             {  

19                 for(i=0,j=1;i<a/2-1;i++)  

20                 {  

21                     cout<<a-i<<" "<<i+1<<" ";  

22                 }  

23                 cout<<a/2+1<<" "<<a/2<<endl;  

24             }  

25             else  

26             {  

27                 for(i=0,j=1;i<a/2;i++)  

28                 {  

29                     cout<<a-i<<" "<<i+1<<" ";  

30                 }  

31                 cout<<a/2+1<<endl;  

32             }  

33         }  

34         return 0;  

35     }  
View Code

1125 ACfun

 1 /*

 2 题意:找到最长的连续A的个数n,然后输出n+1个A

 3 思路:暴力。

 4 */

 5 #include<cstdio>

 6 #include<cstring>

 7 #include<iostream>

 8 using namespace std;

 9 int main()

10 {

11  char s[1001];

12  int i,j,k,l,t;

13  int sum,max;

14  cin>>t;

15  getchar();

16  while(t--)

17  {

18    sum=max=0;

19    gets(s);

20    for(i=0;i<strlen(s);i++)

21    {

22      if(s[i]=='A')

23      { sum=1;

24       

25      for(j=i+1;j<strlen(s);j++)

26      {

27        if(s[i]==s[j])

28          sum++;

29        if(sum>max)

30        max=sum;

31        if(s[i]!=s[j])

32        {

33          sum=1;

34          break;

35        }

36      }

37      }

38    }

39    for(i=0;i<=max;i++)

40      printf("A");

41    printf("\n");

42  }

43  return 0;

44 }
View Code

 

你可能感兴趣的:(cd)